今日内容概要
1. 进程间数据是隔离的
2. Queue => 队列
3. 生产者消费者模型
今日内容详情
-
进程间数据是隔离的
from multiprocessing import Process def task(): global n n = 100 print('xxx', n) if __name__ == '__main__': p = Process(target=task) p.start() n = 10 print('zzz', n)
-
解决进程间隔离问题
import os from multiprocessing import Queue,Process def task(queue): print('这个进程id:%s开始放数据了'%os.getpid()) queue.put('wkj XXX') print('这个进程id:%s放完了'%os.getpid()) if __name__ == '__main__': q=Queue(3) p=Process(target=task,args=(q,)) p.start() print('zjc') res=q.get() print('主进程取值',res)
-
多进程存储数据
import os from multiprocessing import Queue,Process def get_task(queue): print('%s:%s'%(os.getpid(),queue.get())) def put_task(queue): queue.put('%s开始放数据了'%os.getpid()) if __name__ == '__main__': q=Queue(3) p=Process(target=put_task,args=(q,)) p.start() p1 = Process(target=put_task, args=(q,)) p1.start() p2 = Process(target=get_task, args=(q,)) p2.start() p3 = Process(target=get_task, args=(q,)) p3.start()
-
生产者消费者模型
import os import time import random from multiprocessing import Process,Queue # # 版本一 # 生产者 def producer(queue): # 把数据全部放在Queue for i in range(10): data='这个进程id:%s蒸了第%s个包子'%(os.getpid(),i) print(data) time.sleep(random.randint(1,3)) queue.put('%s个包子'%i) def consumer(queue): while True: res=queue.get() data = '这个进程id:%s吃了%s' % (os.getpid(), res) print(data) if __name__ == '__main__': q=Queue(3) p=Process(target=producer,args=(q,)) p.start() p1=Process(target=consumer,args=(q,)) p1.start() # 版本二 def producer(queue): # 把数据全部放在Queue for i in range(10): data = '这个进程id:%s蒸了第%s个包子' % (os.getpid(), i) print(data) time.sleep(random.randint(1, 3)) queue.put('%s个包子' % i) queue.put(None) def consumer(queue): while True: res = queue.get() if not res:break data = '这个进程id:%s吃了%s' % (os.getpid(), res) print(data) if __name__ == '__main__': q = Queue(3) p = Process(target=producer, args=(q,)) p.start() p1 = Process(target=consumer, args=(q,)) p1.start() # 版本三 def producer(queue): # 把数据全部放在Queue for i in range(10): data = '这个进程id:%s蒸了第%s个包子' % (os.getpid(), i) print(data) time.sleep(random.randint(1,2)) queue.put('%s个包子' % i) def consumer(queue): while True: res = queue.get() if not res: break data = '这个进程id:%s吃了%s' % (os.getpid(), res) print(data) if __name__ == '__main__': q = Queue(3) p = Process(target=producer, args=(q,)) p.start() p1 = Process(target=consumer, args=(q,)) p1.start() # time.sleep(20) p.join() q.put(None)# None放在这里不合适,原因是主进程直接执行put None # 版本四 生产者大于消费者 def producer(queue,food): # 把数据全部放在Queue for i in range(10): data = '这个进程id:%s生产第%s个%s' % (os.getpid(), i,food) print(data) time.sleep(random.randint(1, 2)) queue.put('第%s个%s' % (i,food)) def consumer(queue,name): while True: res = queue.get() if not res: break data = '这个消费者%s吃了%s' % (name, res) print(data) if __name__ == '__main__': q = Queue(3) p1 = Process(target=producer, args=(q,'面包')) p2 = Process(target=producer, args=(q,'奶粉')) p3 = Process(target=producer, args=(q,'冰淇淋')) p1.start() p2.start() p3.start() p4 = Process(target=consumer, args=(q,'wkj1')) p5 = Process(target=consumer, args=(q,'wkj2')) p4.start() p5.start() p1.join() p2.join() p3.join() q.put(None) q.put(None) q.put(None) # 版本五 生产者小于消费者 def producer(queue, food): # 把数据全部放在Queue for i in range(10): data = '这个进程id:%s生产第%s个%s' % (os.getpid(), i, food) print(data) time.sleep(random.randint(1, 2)) queue.put('第%s个%s' % (i, food)) def consumer(queue, name): while True: try: res = queue.get(timeout=5) if not res: break data = '这个消费者%s吃了%s' % (name, res) print(data) except Exception as e: print(e) break if __name__ == '__main__': q = Queue(3) p1 = Process(target=producer, args=(q, '面包')) p2 = Process(target=producer, args=(q, '奶粉')) p3 = Process(target=producer, args=(q, '冰淇淋')) p1.start() p2.start() p3.start() p4 = Process(target=consumer, args=(q, 'wkj1')) p5 = Process(target=consumer, args=(q, 'wkj2')) p6 = Process(target=consumer, args=(q, 'wkj3')) p7 = Process(target=consumer, args=(q, 'wkj4')) p4.start() p5.start() p6.start() p7.start() p1.join() p2.join() p3.join() q.put(None) q.put(None) q.put(None)