Python的multiprocessing模块提供了多种进程间通信的方式,如Queue、Pipe等。

Queue是multiprocessing提供的一个模块,它的数据结构就是"FIFO——first in first out"的队列,常用的方法有:put(object)入队;get()出队;empty()判断队列是否为空。Lock:当多个子进程对同一个queue执行写操作时,为了避免并发操作产生冲突,可以通过加锁的方式使得某个子进程对queue拥有唯一的写权限,其他子进程必须等待该锁释放后才能再开始执行写操作。

下面就是使用Queue进行进程间通信的代码:在父进程里创建两个子进程,分别实现对queue的读和写操作:

#!/usr/bin/python
# -*- coding: utf-8 -*
__author__ = 'zni.feng'
import  sys
reload (sys)
sys.setdefaultencoding('utf-8')
from multiprocessing import Process, Queue, Lock
import os, time, random
#写数据进程
def write(q, lock, name):print 'Child Process %s starts' % name#获得锁lock.acquire()for value in ['A' , 'B', 'C']:print 'Put %s to queue...' % valueq.put(value)time.sleep(random.random())#释放锁lock.release()print 'Child Process %s ends' % name#读数据进程
def read(q, lock, name):print 'Child Process %s starts' % namewhile True: #持续地读取q中的数据value =q.get()print 'Get %s from queue.' % valueprint 'Child Process %s ends' % nameif __name__ == "__main__":#父进程创建queue,并共享给各个子进程q= Queue()#创建锁lock = Lock()#创建第一个“写”子进程pw = Process(target = write , args=(q, lock, 'WRITE', ))#创建“读”进程pr = Process(target = read, args=(q,lock, 'READ',))#启动子进程pw,写入:pw.start()#启动子进程pr,读取:pr.start()#等待pw结束:pw.join()#pr是个死循环,通过terminate杀死:pr.terminate()print 'Test finish.'

运行结果:

Child Process WRITE starts
Put A to queue...
Child Process READ starts
Get A from queue.
Put B to queue...
Get B from queue.
Put C to queue...
Get C from queue.
Child Process WRITE ends
Test finish.
[Finished in 2.0s]Pipe是另一种进程间通信的方式,俗称“管道”。它由两端组成,一端往管道里写入数据,另一端从管道里读取数据。

下面就是使用Pipe通信的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*
__author__ = 'zni.feng'
import  sys
reload (sys)
sys.setdefaultencoding('utf-8')
from multiprocessing import Process, Pipe
import os, time, random#发送数据进程
def send(child_pipe, name):print 'Child Process %s starts' % namechild_pipe.send('This is Mr.Ni')child_pipe.close()time.sleep(random.random())print 'Child Process %s ends' % name#接收数据进程
def recv(parent_pipe, name):print 'Child Process %s starts' % nameprint parent_pipe.recv()time.sleep(random.random())print 'Child Process %s ends' % nameif __name__ == "__main__":#创建管道parent,child = Pipe()#创建send进程ps = Process(target=send, args=(child, 'SEND'))#创建recv进程pr = Process(target=recv, args=(parent, 'RECEIVE'))#启动send进程ps.start()#等待send进程结束ps.join()#启动recv进程pr.start()#等待recv进程结束pr.join()print 'Test finish.'

运行结果:

Child Process SEND starts
Child Process SEND ends
Child Process RECEIVE starts
This is Mr.Ni
Child Process RECEIVE ends
Test finish.
[Finished in 1.8s]

Python多进程与进程锁的基本使用相关推荐

  1. Python 多进程的进程池pool运行时报错:ValueError: Pool not running

    本文仅供学习交流使用,如侵立删!demo下载见文末 Python 多进程的进程池pool运行时报错:ValueError: Pool not running def main(self, num):& ...

  2. Python多进程4 进程池——Pool

    原文地址 学习来源 分类目录--多进程 是multiprocessing模块下的一个类,是一种创建多进程的更加简便的方式,可以更加方便的分配任务与传递参数. pool = mp.Pool(proces ...

  3. python多进程之进程的terminate() 函数

    python多进程之进程的terminate() 函数 terminate() 函数 是用来杀死子进程的 举例如下: from multiprocessing import Process impor ...

  4. python 多进程multiprocessing进程池pool tensorflow-yolov3 报错 MemoryError

    进程数设置为1-9个都能正常运行,设置成10个就开始报错,怪事! D:\20191031_tensorflow_yolov3\python\python.exe D:/20191031_tensorf ...

  5. python多进程和进程池

    写在最前面: linux下可使用 fork 函数 通常使用 multiprocessing更常见 我们分别使用单进程和多进程处理run函数 # -*- coding: utf-8 -*- import ...

  6. python 多进程——使用进程池,多进程消费的数据)是一个队列的时候,他会自动去队列里依次取数据...

    我的mac 4核,因此每次执行的时候同时开启4个线程处理: # coding: utf-8import time from multiprocessing import Pooldef long_ti ...

  7. python—多进程之进程池

    一.进程池 1.进程池定义: 进程池:可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该 ...

  8. python—多进程之进程之间通信

    一.Queue 1.导入:from multiprocessing import Queue 2.进程间数据通信之Queue示意图: mq.put(i) 子进程1发送数据到队列Queue中,子进程2和 ...

  9. python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法

    apply函数主要用于传递不定参数,主进程会被阻塞到函数执行结束.也就是说只有apply里面的内容被执行完了,才会进行执行主函数的内容. 参考文章1:python进程池Pool的apply与apply ...

最新文章

  1. ceres实现的pnp解算后的位姿优化代码详解
  2. 刘知远:近年来开源的算法代码、工具包列表
  3. 八步搞定个人计算机安全
  4. 行转列:SQL SERVER PIVOT与用法解释
  5. JpaSpecificationExecutor
  6. reactor多线程模型_网络编程模型的演进之路
  7. linux如何查看git安装路径,Git - 如何验证Ubuntu上是否安装Git以及在何处安装Git - Ubuntu问答...
  8. Shell编程之if语法练习(LNMP)全过程
  9. 请假一天,回粤西老家买了套房
  10. 计组之数据运算:9、浮点数的表示
  11. MySQL定时备份数据库方案(全库备份)
  12. 剑指offer面试题[9]-裴波那契数列
  13. java基础算法题(入门题与简单题)
  14. 65 年来,全英国向他道歉三次
  15. ibm服务器怎么收集日志信息,IBM X86 服务器Linux下收集DSA日志方法(包含BMC信息)...
  16. 面试官:如何实现扫码登录功能?
  17. guid分区怎么装win7_如何使用GUID硬盘分区格式安装新windows系统
  18. OPEN-WRT老毛子固件的无线中继设置建议
  19. 谷歌地图离线发布系列之偏移处理(三)纠偏算法
  20. 疯了!一个rm-rf把公司整个数据库删没了...

热门文章

  1. qprocess start怎么判断是否结束_面试结束后,如何判断自己是否有戏?看有无这8大信号!...
  2. Elasticsearch 参考指南(脚本)
  3. NA-NP-IE系列实验36:扩展ACL
  4. 【Python】向函数传递任意数量的实参
  5. MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
  6. JSP 三 :九大隐式对象
  7. 数据仓库数据模型之:极限存储--历史拉链表
  8. 如何定位EXC_BAD_ACCESS错误 (info malloc-history)
  9. [转] ASP.NET MVC3 路由和多数据集的返回
  10. 三,ES6中需要注意的特性(重要)