python高级03——多任务编程
1、多任务介绍
之前写的程序都是单任务的,即一个函数执行完再去执行另一个,想要多个函数同时执行就要用到多任务,可利用CPU资源,从而提高程序执行效率。
概念
在同一时间内执行多个任务。
例如现在的操作系统就是多任务操作系统,同时运行多个软件。
两种表现形式
1、并发
在一段时间内交替执行多个任务。
如在单核CPU中执行多个程序,表面上看不同程序是在同时进行,实质上是操作系统让每个任务交替执行。
2、并行
一段时间内真正同时一起执行多个任务。任务数量小于等于CPU核心数。
如多核CPU。
2、多进程介绍
在python中实现多任务要用进程完成。
1、进程的概念
process是资源分配的最小单位,是操作系统进行资源分配和调度运行的基本单位,通俗理解,一个正在运行的程序就是一个进程,没有运行时只是一个软件。
2、多进程的作用
3、多进程完成多任务
进程的创建步骤
1、导入进程包
import multiprocessing
2、通过进程类创建进程对象
进程对象=multiprocessing.Process()
3、启动进程执行任务
进程对象.start()
例子
没有创建子进程:
import timedef coding():for i in range(3):print("coding...")time.sleep(0.2) def music():for i in range(3):print("music...")time.sleep(0.2)if __name__=='__main__':coding()music()
创建子进程:
import time
import multiprocessingdef coding():for i in range(3):print("coding...")time.sleep(0.2)def music():for i in range(3):print("music...")time.sleep(0.2)if __name__=='__main__':#通过进程类创建进程对象coding_process=multiprocessing.Process(target=coding)music_process=multiprocessing.Process(target=music)#启动进程coding_process.start()music_process.start()
4、进程执行带有参数的任务
#args:以元组的形式给函数传参,传参要和参数的顺序保持一致
#kwargs:以字典的形式给函数传参,传参中的key要和参数名保持一致#一个参数
import time
import multiprocessingdef coding(num):for i in range(num):print("coding...")time.sleep(0.2)def music(num):for i in range(num):print("music...")time.sleep(0.2)if __name__=='__main__':#通过进程类创建进程对象coding_process=multiprocessing.Process(target=coding,args=(3,))music_process=multiprocessing.Process(target=music,kwargs={"num":3})#启动进程coding_process.start()music_process.start()
#两个参数
import time
import multiprocessingdef coding(num,name):for i in range(num):print("coding...")print(name)time.sleep(0.2)def music(num):for i in range(num):print("music...")time.sleep(0.2)if __name__=='__main__':#通过进程类创建进程对象coding_process=multiprocessing.Process(target=coding,args=(3,"子进程"))music_process=multiprocessing.Process(target=music,kwargs={"num":3})#启动进程coding_process.start()music_process.start()
5、获取进程编号
获取当前进程:getpid()方法
获取当前父进程:getppid()方法
需要import os,用os.getpid()和os.getppid()
import time
import multiprocessing
import osdef coding(num,name):print("coding=%d"% os.getpid()) #获取当前进程编号print("父进程=%d" % os.getppid()) # 获取父进程编号for i in range(num):print("coding...")print(name)time.sleep(0.2)def music(num):print("music=%d" % os.getpid()) #获取当前进程编号print("父进程=%d" % os.getppid()) # 获取父进程编号for i in range(num):print("music...")time.sleep(0.2)if __name__=='__main__':print("父进程=%d"% os.getpid()) #获取父进程编号coding_process=multiprocessing.Process(target=coding,args=(3,"子进程"))music_process=multiprocessing.Process(target=music,kwargs={"num":3})coding_process.start()music_process.start()
6、进程间不共享全局变量
import multiprocessing
import os#全局变量
my_list=[]#写入数据进程
def write_data():for i in range(3):my_list.append(i)print("add:%d"%i)print("write",my_list)#读取数据进程
def read_data():print("read",my_list)if __name__=='__main__':write_process=multiprocessing.Process(target=write_data)read_process=multiprocessing.Process(target=read_data)write_process.start()read_process.start()
7、主进程和子进程的结束顺序
主进程会等待所有子进程结束才会结束:
import multiprocessing
import os
import timedef work():for i in range(10):print("working...")time.sleep(0.2)if __name__=='__main__':work_process=multiprocessing.Process(target=work)work_process.start()time.sleep(1)print("主进程执行完了")
法一:可以设置守护主进程:用daemon
import multiprocessing
import os
import timedef work():for i in range(10):print("working...")time.sleep(0.2)if __name__=='__main__':work_process=multiprocessing.Process(target=work)work_process.daemon=True #设为守护主进程,如果主进程结束,子进程不再执行work_process.start()time.sleep(1)print("主进程执行完了")
法二:销毁子进程:用terminate
import multiprocessing
import os
import timedef work():for i in range(10):print("working...")time.sleep(0.2)if __name__=='__main__':work_process=multiprocessing.Process(target=work)work_process.start()time.sleep(1)work_process.terminate() #手动结束子进程print("主进程执行完了")
3、多线程介绍
python中实现多任务还可以用多线程,同样的需求可以使用多线程。