当前位置:   article > 正文

Python多进程(multiprocessing)(mp)(三) —— 进程间通信 & Queue队列(Manager)_multiprocessing.manager().queue()

multiprocessing.manager().queue()

进程间通信

      全局变量在多个进程中不共享,进程之间的数据是独立的,默认情况下互不影响
 

  1. from multiprocessing import Process
  2. num=1
  3. def work1():
  4. global num
  5. num+=5
  6. print('子进程 1 运行, num:',num)
  7. def work2():
  8. global num
  9. num += 10
  10. print('子进程 2 运行, num: ',num)
  11. if __name__=='__main__':
  12. print('父进程开始运行')
  13. p1=Process(target=work1)
  14. p2=Process(target=work2)
  15. p1.start()
  16. p2.start()
  17. p1.join()
  18. p2.join()
'
运行

用 Queue 实现多进程之间的数据传递

      Queue 是多进程安全的队列,可以使用 Queue 实现多进程之间的数据传递。

      put 方法用以插入数据到队列中, put 方法还有两个可选参数: blocked 和 timeout。如果 blocked 为 True(默认值),并且 timeout 为正值,该方法会阻塞 timeout 指定的时间,直到该队列有剩余的空间。如果超时,会抛出 Queue.full 异常。如果 blocked 为 False,但该 Queue 已满,会立即抛出 Queue.full 异常。

      get 方法可以从队列读取并且删除一个元素。同样, get 方法有两个可选参数: blocked和 timeout。如果 blocked 为 True(默认值),并且 timeout 为正值,那么在等待时间内没有取到任何元素,会抛出 Queue.Empty 异常。如果 blocked 为 False,有两种情况存在,如果Queue 有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty 异常
 

  1. from multiprocessing import Queue
  2. q=Queue(3)
  3. q.put('消息 1')
  4. q.put('消息 2')
  5. print('消息队列是否已满: ',q.full())
  6. q.put('消息 3')
  7. print('消息队列是否已满: ',q.full())
  8. #q.put('消息 4')因为消息队列已满,需要直接写入需要等待,如果超时会抛出异常,
  9. #所以写入时候需判断,消息队列是否已满
  10. if not q.full():
  11. q.put('消息 4')
  12. #同理读取消息时,先判断消息队列是否为空,再读取
  13. if not q.empty():
  14. for i in range(q.qsize()):
  15. print(q.get())
'
运行

Queue 队列实现进程间通信

  1. from multiprocessing import *
  2. import time
  3. def write(q):
  4. #将列表中的元素写入队列中
  5. for i in ["a","b","c"]:
  6. print('开始写入值%s' % i)
  7. q.put(i)
  8. time.sleep(1)
  9. #读取
  10. def read(q):
  11. print('开始读取')
  12. while True:
  13. if not q.empty():
  14. print('读取到:',q.get())
  15. time.sleep(1)
  16. else:
  17. break
  18. if __name__=='__main__':
  19. #创建队列
  20. q=Queue()
  21. #创建写入进程
  22. pw=Process(target=write,args=(q,))
  23. pr=Process(target=read,args=(q,))
  24. #启动进程
  25. pw.start()
  26. pw.join()
  27. pr.start()
  28. pr.join()
'
运行

        如果使用 Pool 创建进程,就需要使用 multiprocessing.Manager()中的 Queue()来完成进程间的通信,而不是 multiprocessing.Queue(),否则会抛出异常

  1. from multiprocessing import Manager,Pool
  2. import time
  3. def write(q):
  4. #将列表中的元素写入队列中
  5. for i in ["a","b","c"]:
  6. print('开始写入值%s' % i)
  7. q.put(i)
  8. time.sleep(1)
  9. #读取
  10. def read(q):
  11. print('开始读取')
  12. while True:
  13. if not q.empty():
  14. print('读取到:',q.get())
  15. time.sleep(1)
  16. else:
  17. break
  18. if __name__=='__main__':
  19. #创建队列
  20. q=Manager().Queue()
  21. #创建进程池
  22. p=Pool(3)
  23. #使用apply阻塞模式创建进程
  24. p.apply(write,(q,))
  25. p.apply(read,(q,))
  26. p.close()
  27. p.join()
'
运行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/860634
推荐阅读
相关标签
  

闽ICP备14008679号