Python 全栈工程师核心面试 300 问深入解析(2020 版)----全文预览
from multiprocessing import Pool, Process, Queue
from Queue import Queue
Queue.Queue是进程内非阻塞队列,multiprocess.Queue是跨进程通信队列。
1.from queue import Queue
这个是普通的队列模式,类似于普通列表,先进先出模式,get方法会阻塞请求,直到有数据get出来为止
2.from multiprocessing.Queue import Queue(各子进程共有)
这个是多进程并发的Queue队列,用于解决多进程间的通信问题。普通Queue实现不了。例如来跑多进程对一批IP列表进行运算,运算后的结果都存到Queue队列里面,这个就必须使用multiprocessing提供的Queue来实现
#child —child process commucation
from multiprocessing import Process,Queue
import os,time,random
def write(q):
for value in [‘a’,‘b’,‘c’]:
print(‘put %s to queue…’ % value)
q.put(value)
time.sleep(random.random())
def read(q):
while True:
if not q.empty():
value = q.get()
print(‘get %s from queue’ % value)
time.sleep(random.random())
else:
break
if name == ‘main’:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
pw.start()
pr.start()
pw.join()
pr.join()
print(‘all datas have been writen and been read’)
如果是用進程池,那麼就需要使用Manager().Queue()隊列才能在各子進程間通信,否則沒用
p = Pool()
q = Manager().Queue()
pw = p.apply_async(write,args=(q,))
time.sleep(0.5)
pr = p.apply_async(read,args=(q,))
p.close()
p.join()
print(‘all datas have been writen and been read’)
如果要在manger().Queue()中使用鎖,就要
manager = Manager()
q = manager.Queue()
lock = manager.Lock() #鎖的獲取和釋放都一樣
参考文章:
python队列Queue