学习笔记之四十四(二)
#进程通信:
main 加tab 快捷键 ,写if name==‘main’:
target=func 将这个函数传递给 target
target=func() 将函数的调用结果传递给target
不同进程间通信靠公用的队列queue
具体例如下:from multiprocessing import Process,
Queue
from time import sleep
def download(q):
images=[‘gilr.jpg’,‘boy.jpg’,‘man.jpg’]
for image in images:
print(‘正在下载{}’.format(i))
sleep(1)
q.put(‘image’)
print(‘下载成功’)
def getfile(q):
while True:
try:
file=q.get(timeout=3)
print(’{}保存成功!’.format(file))
except:
print(‘全部保存成功!’)
break!
if name==‘main’:
q=Queue(5) P1=Process(target=download,args=(q,)) p2=Process(target=getfile,args=(q,))
p1.start()
p1.join()
p2.start()
p2.join()
print(’…主进程执行最后一句’)
总结:
1、因为两个子进程p1,p2互相通信共用的队列q,所以两个进程都传参args=q,且两个方法中也传参q
2、getfile中不加while True,那么该方法就执行一次后停止,导致只获取了一个下载结果后程序停在那里
3、因为q.get的阻塞性能,加上timeout=3,取完队列中第三个文件等待三秒后会报异常,为了防止这个的发生,加try-except ,盘活整段代码
4、本来代码的执行是从上往下,一句一句来,即p1.start() 下载一个文件后,就轮到p2.start() 获取一个文件,然后轮到主进程运行, 加上p1.join() 后,就相当于p1进程插队,当p1进程三个文件全部取完后,再轮到p2进程开始执行,这就是join() 的让主进程和后边的进程让步,插队的终极解释