第一种
普通的队列from queue import Queue
但是,使用普通队列,就要用run()启动进程而不能用start()
import multiprocessing
from queue import Queue
def download(q):
'''下载数据'''
lis = [11, 22, 33]
for item in lis:
q.put(item)
print("下载完成,并且保存到队列中...")
def analysis(q):
'''数据处理'''
analysis_data = list()
while True:
data = q.get()
print(data)
analysis_data.append(data)
if q.empty():
break
print(analysis_data)
def main():
'''普通队列'''
q = Queue(3)
t1 = multiprocessing.Process(target=download, args=(q, ))
t2 = multiprocessing.Process(target=analysis, args=(q, ))
t1.run()
t2.run()
if __name__ == '__main__':
main()
第二种
multiprocessing模块中的队列multiprocessing.Queue(n)
import multiprocessing
def download(q):
'''下载数据'''
lis = [11, 22, 33]
for item in lis:
q.put(item)
print("下载完成,并且保存到队列中...")
def analysis(q):
'''数据处理'''
analysis_data = list()
while True:
data = q.get()
print(data)
analysis_data.append(data)
if q.empty():
break
print(analysis_data)
def main():
'''创建一个队列 跨进程通信的队列'''
q = multiprocessing.Queue(3)
t1 = multiprocessing.Process(target=download, args=(q, ))
t2 = multiprocessing.Process(target=analysis, args=(q, ))
t1.start()
t2.start()
if __name__ == '__main__':
main()
第三种
进程池中,队列实现进程间通信multiprocessing.Manager().Queue()
import multiprocessing
def download(q):
# 进程池里面的进程 如果出现异常 不会主动抛出
try:
lis = [11, 22, 33]
for item in lis:
q.put(item)
except Exception as e:
print(e)
print("下载完成,并且保存到队列中...")
def analysis(q):
try:
analysis_data = list()
while True:
data = q.get()
print(data)
analysis_data.append(data)
if q.empty():
break
except Exception as e:
print(e)
print(analysis_data)
if __name__ == '__main__':
q = multiprocessing.Manager().Queue()
'''进程池可容纳的进程数为2,超出数量的进程要等待'''
po = multiprocessing.Pool(2)
'''apply_async向进程池中添加进程'''
po.apply_async(download, args=(q,))
po.apply_async(analysis, args=(q,))
'''关闭进程池 不在接收新的请求'''
po.close()
'''等待子进程执行完成'''
po.join()
print("---end---")