进程常用方法:
start():启动进程实例
is_alive():判断子进程的存活状态,返回True或False,子进程执行完后的状态为False
join([timeout]):是否等待子进程执行结束(在当前位置阻塞主进程)主进程等子进程多长时间timeout
terminate():不管任务是否完成,立即终止子进程
子进程创建需要时间,在空闲时间内父进程会继续执行代码
from multiprocessing import Processdef sing(name1):print(f'{name1}唱歌') def dance(name2):print(f'{name2}跳舞')if __name__=="__main__":#创建进程p1=Process(target=sing,args=('lihailu',))p2 = Process(target=dance, args=('lihai',))#启动进程p1.start()#p1.join()#阻塞主进程等待子进程执行完后再执行下面的代码p2.start()print('p1的状态是:',p1.is_alive())print('p2的状态是:', p2.is_alive())
进程间不同享全局变量:
from multiprocessing import Process import timelist=[]#全局变量def funa():for i in range(3):list.append(i)time.sleep(1)print('funa子进程:',list)def funb():print('funb子进程:',list)if __name__=="__main__":#创建子进程p1=Process(target=funa)p2 = Process(target=funb)#启动进程p1.start()#p1.join()#阻塞主进程等待子进程执行完后再执行下面的代码p2.start()print('p1的状态是:',p1.is_alive())print('p2的状态是:', p2.is_alive())
输出结果为:
p1的状态是: True
p2的状态是: True
funb子进程: []
funa子进程: [0]
funa子进程: [0, 1]
funa子进程: [0, 1, 2]
***可见funb子进程不影响funa子进程
进程与线程相同点:
进程能够完成多任务,同一台电脑上可以同时运行多个软件,打开多个qq号登录
线程能够完成多任务,如某个软件打开的多个窗口,qq多人聊天窗口
区别:
1.线程资源可共享,进程间资源不共享
2.一个程序至少有一个进程,一个进程至少有一个线程
3.线程划分的尺度小于进程,资源比进程少,多线程程序并发行高。进程在执行过程中拥有独立的内存单元,而线程不能够独立执行,必须依存在进程中
线程执行开销小,但不得资源的管理和保护,进程正好相反
结论:计算密集型:计算量比较大时,如复杂的加减乘除运算时,用多进程
IO密集型:如爬虫,文件读写等用多线程