进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所有进程间数据不共享,开销大。
僵尸进程:进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait获取waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。
孤儿进程:父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init进程(进程号为1)所收养,并由init进程对他们完成状态收集工作。
避免僵尸进程的方法:
fork两次用孙子进程去完成子进程的任务
用wait()函数使父进程阻塞
使用信号量,在signal handler中调用waitpid,这样父进程不用阻塞。
创建进程:
import os
from mulitprocessing import Process
import time
def pro_great(*args):
for i in range(5):
print("子进程正在运行中,pid=%d"%(,os.getpid())
time.sleep(1)
if __name__ =="__main__":
#创建Process对象
p = Process(target=pro_great,kwargs={'m':20})
#启动进程
p.start()
p.join()
创建进程池:
import time
import os
from multiprocessing import Pool
def jcc(num):
print(num)
print('进程已经创建id为%d'%os.getpid())
time.sleep(1)
if __name__ == '__main__':
p = Pool(3)
for i in range(20):
p.apply_async(jcc,(i,))
p.close()
p.join()
进程间的交互:
进程间的交互需要用到队列Queue
import time,os
from multiprocessing import *
def writ(q):
listq=['a','c','v','n']
for i in listq:
q.put(i)
time.sleep(3)
def reado(q):
while True:
if not q.empty():
print(q.get())
else:
break
if __name__ == '__main__':
q = Queue()
qw = Process(target=writ,args=(q,))
qw.start()
qw.join()
qe = Process(target=reado,args=(q,))
qe.start()
qe.join()