Python多进程与进程锁的基本使用
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多进程与进程锁的基本使用相关推荐
- Python 多进程的进程池pool运行时报错:ValueError: Pool not running
本文仅供学习交流使用,如侵立删!demo下载见文末 Python 多进程的进程池pool运行时报错:ValueError: Pool not running def main(self, num):& ...
- Python多进程4 进程池——Pool
原文地址 学习来源 分类目录--多进程 是multiprocessing模块下的一个类,是一种创建多进程的更加简便的方式,可以更加方便的分配任务与传递参数. pool = mp.Pool(proces ...
- python多进程之进程的terminate() 函数
python多进程之进程的terminate() 函数 terminate() 函数 是用来杀死子进程的 举例如下: from multiprocessing import Process impor ...
- python 多进程multiprocessing进程池pool tensorflow-yolov3 报错 MemoryError
进程数设置为1-9个都能正常运行,设置成10个就开始报错,怪事! D:\20191031_tensorflow_yolov3\python\python.exe D:/20191031_tensorf ...
- python多进程和进程池
写在最前面: linux下可使用 fork 函数 通常使用 multiprocessing更常见 我们分别使用单进程和多进程处理run函数 # -*- coding: utf-8 -*- import ...
- python 多进程——使用进程池,多进程消费的数据)是一个队列的时候,他会自动去队列里依次取数据...
我的mac 4核,因此每次执行的时候同时开启4个线程处理: # coding: utf-8import time from multiprocessing import Pooldef long_ti ...
- python—多进程之进程池
一.进程池 1.进程池定义: 进程池:可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该 ...
- python—多进程之进程之间通信
一.Queue 1.导入:from multiprocessing import Queue 2.进程间数据通信之Queue示意图: mq.put(i) 子进程1发送数据到队列Queue中,子进程2和 ...
- python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法
apply函数主要用于传递不定参数,主进程会被阻塞到函数执行结束.也就是说只有apply里面的内容被执行完了,才会进行执行主函数的内容. 参考文章1:python进程池Pool的apply与apply ...
最新文章
- ceres实现的pnp解算后的位姿优化代码详解
- 刘知远:近年来开源的算法代码、工具包列表
- 八步搞定个人计算机安全
- 行转列:SQL SERVER PIVOT与用法解释
- JpaSpecificationExecutor
- reactor多线程模型_网络编程模型的演进之路
- linux如何查看git安装路径,Git - 如何验证Ubuntu上是否安装Git以及在何处安装Git - Ubuntu问答...
- Shell编程之if语法练习(LNMP)全过程
- 请假一天,回粤西老家买了套房
- 计组之数据运算:9、浮点数的表示
- MySQL定时备份数据库方案(全库备份)
- 剑指offer面试题[9]-裴波那契数列
- java基础算法题(入门题与简单题)
- 65 年来,全英国向他道歉三次
- ibm服务器怎么收集日志信息,IBM X86 服务器Linux下收集DSA日志方法(包含BMC信息)...
- 面试官:如何实现扫码登录功能?
- guid分区怎么装win7_如何使用GUID硬盘分区格式安装新windows系统
- OPEN-WRT老毛子固件的无线中继设置建议
- 谷歌地图离线发布系列之偏移处理(三)纠偏算法
- 疯了!一个rm-rf把公司整个数据库删没了...
热门文章
- qprocess start怎么判断是否结束_面试结束后,如何判断自己是否有戏?看有无这8大信号!...
- Elasticsearch 参考指南(脚本)
- NA-NP-IE系列实验36:扩展ACL
- 【Python】向函数传递任意数量的实参
- MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
- JSP 三 :九大隐式对象
- 数据仓库数据模型之:极限存储--历史拉链表
- 如何定位EXC_BAD_ACCESS错误 (info malloc-history)
- [转] ASP.NET MVC3 路由和多数据集的返回
- 三,ES6中需要注意的特性(重要)