from multiprocessing import Queue
q = Queue() # 实例化队列
q.put() # 往队列里放数据
q.get() # 从队列里取数据
print(q.full())#判断队列是否满了
print(q.empty())#判断队列是否为空
生产者消费者模型
from multiprocessing import Process, Queue
import time
def producer(p, name, food):
for i in range(10):
time.sleep(1)
f = '%s生产了第%s个%s' % (name, i, food)
p.put(f)
print(f)
def constom(q, name):
while True:
time.sleep(2)
food = q.get()
if food == None:
break
print('%s吃了一个%s' % (name, food))
if __name__ == '__main__':
q = Queue()
p1 = Process(target=producer, args=(q, 'egon', '包子'))
p2 = Process(target=producer, args=(q, 'xiaohong', '泔水'))
c1 = Process(target=constom, args=(q, 'jin'))
c2 = Process(target=constom, args=(q, 'alex'))
p1.start()
p2.start()
c1.start()
c2.start()
p1.join()
p2.join()
q.put(None)
q.put(None)
使用Joinable实现生产者消费者模型
from multiprocessing import Process,JoinableQueue
import time
import random
def producer(p,name,food):
for i in range (10):
time.sleep(1)
f = '%s生产了第%s个%s'%(name,i,food)
p.put(f)
print(f)
p.join() #阻塞状态,感知一个队列中的数据全部被处理完,才能结束
def constom(q,name):
while True :
time.sleep(2)
food = q.get()
print('%s吃了一个%s'%(name,food))
q.task_done()
if __name__=='__main__':
q = JoinableQueue()
p1 = Process(target=producer,args=(q,'egon','包子'))
p2 = Process(target=producer,args=(q,'xiaohong','泔水'))
c1 = Process(target=constom,args=(q,'jin'))
c2 = Process(target=constom,args=(q,'alex'))
p1.start()
p2.start()
c1.daemon=True
c2.daemon=True
c1.start()
c2.start()
p1.join()
p2.join()
通过管道实现生产者消费者模型
from multiprocessing import Process,Pipe
import time
import random
def producer(pro,conn,name,food):
conn.close()
for i in range (10):
time.sleep(1)
f = '%s生产了第%s个%s'%(name,i,food)
print(f)
pro.send(f)
pro.close()
def constom(pro,conn,name):
pro.close()
while True :
try:
time.sleep(2)
food = conn.recv()
print('%s吃了一个%s'%(name,food))
except EOFError:
conn.close()
break
if __name__=='__main__':
pro,conn = Pipe()
p1 = Process(target=producer,args=(pro,conn,'egon','包子'))
c1 = Process(target=constom,args=(pro,conn,'jin'))
p1.start()
c1.start()
pro.close()
conn.close()
可能出现同一个进程拿到同一个数据,需要加锁来控制管道的行为,来避免进程之间争夺数据造成的数据不安全现象