python多进程(multiprocessing)
最近有个小课题,需要用到双进程,翻了些资料,还算圆满完成任务。记录一下~
1.简单地双进程启动
同时的调用print1()和print2()两个打印函数,代码如下:
#/usr/bin/python import multiprocessing
import time run = 1
def print1():
while run == 1:
print 'print 1'
time.sleep(1)
def print2():
while run == 1:
print 'print 2'
time.sleep(1) if __name__ == '__main__':
p1 = multiprocessing.Process(target = print1,)
p2 = multiprocessing.Process(target = print2,)
p1.start()
p2.start()
结果:
print 1
print 2
print 1
print 2
...
在课题中遇到了进程p2要使用进程p1中数据的问题,考虑使用IPC的方法来处理,首先考虑了multiprocessing包里地Pipe类来实现。
2.Pipe
Pipe可以是单向(half-duplex),也可以是双向(duplex)。通过multiprocessing.Pipe(duplex = False) 创建单向管道(默认为双向)。一个进程从Pipe一段输入对象,然后被Pipe另一端的进程接收,单向管道只允许管道一端的进程输入,而双向管道则允许从两端输入。
单向传输,代码如下:
#/usr/bin/python import multiprocessing
import time run = 1
def print1(pipe):
num = 0
while run == 1:
print 'print 1:'
pipe.send(str(num))
num = num + 1
time.sleep(1)
def print2(pipe):
while run == 1:
print 'print 2:'+pipe.recv()
time.sleep(2) if __name__ == '__main__':
pipe = multiprocessing.Pipe(duplex=False)
p1 = multiprocessing.Process(target = print1,args = (pipe[1],))
p2 = multiprocessing.Process(target = print2,args = (pipe[0],))
p1.start()
p2.start()
结果:
print 1:
print 2:0
print 1:
print 1:
print 2:1
print 1:
print 1:
print 2:2
print 1:
print 1:
print 2:3
print 1:
print 1:
print 2:4
双向传输,代码如下:
#/usr/bin/python import multiprocessing
import time run = 1
def print1(pipe):
while run == 1:
pipe.send('1')
print 'print 1:'+pipe.recv()
time.sleep(1)
def print2(pipe):
while run == 1:
pipe.send('2')
print 'print 2:'+pipe.recv()
time.sleep(1) if __name__ == '__main__':
pipe = multiprocessing.Pipe(duplex=True)
p1 = multiprocessing.Process(target = print1,args = (pipe[0],))
p2 = multiprocessing.Process(target = print2,args = (pipe[1],))
p1.start()
p2.start()
结果:
print 2:1
print 1:2
print 2:1
print 1:2
3.共享内存
因为课题中,两个进程的循环时间不同,接收进程慢于发送进程,使用双进程的话,会造成进程等待,而单进程的话,接收进程是从队列中按顺序取数据,不能获取实时更新数据,所以考虑使用资源共享解决这一问题。
#/usr/bin/python import multiprocessing
import time run = 1
def print1(data,arr):
while run == 1:
print 'print 1:'
data.value = data.value + 1
arr[0] = data.value
time.sleep(1)
def print2(data,arr):
while run == 1:
print 'print 2:'+str(data.value)
print arr[:]
time.sleep(2) if __name__ == '__main__':
data = multiprocessing.Value('i',0) #整数
arr = multiprocessing.Array('d',range(10)) #列表
p1 = multiprocessing.Process(target = print1,args = (data,arr))
p2 = multiprocessing.Process(target = print2,args = (data,arr))
p1.start()
p2.start()
结果:
print 2:0
[print 1:
0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
print 1:
print 2:2
[2.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
print 1:
print 1:
print 2:4
[4.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
print 1:
print 1:
print 2:6
[6.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
...
python多进程(multiprocessing)的更多相关文章
- Python 多进程 multiprocessing.Pool类详解
Python 多进程 multiprocessing.Pool类详解 https://blog.csdn.net/SeeTheWorld518/article/details/49639651
- Python多进程multiprocessing使用示例
mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multipr ...
- Python 多进程multiprocessing
一.python多线程其实在底层来说只是单线程,因此python多线程也称为假线程,之所以用多线程的意义是因为线程不停的切换这样比串行还是要快很多.python多线程中只要涉及到io或者sleep就会 ...
- python ---多进程 Multiprocessing
和 threading 的比较 多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 ...
- python多进程-----multiprocessing包
multiprocessing并非是python的一个模块,而是python中多进程管理的一个包,在学习的时候可以与threading这个模块作类比,正如我们在上一篇转载的文章中所提,python的多 ...
- python多进程multiprocessing Pool相关问题
python多进程想必大部分人都用到过,可以充分利用多核CPU让代码效率更高效. 我们看看multiprocessing.pool.Pool.map的官方用法 map(func, iterable[, ...
- 操作系统OS,Python - 多进程(multiprocessing)、多线程(multithreading)
多进程(multiprocessing) 参考: https://docs.python.org/3.6/library/multiprocessing.html 1. 多进程概念 multiproc ...
- python多进程multiprocessing模块中Queue的妙用
最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...
- Python(多进程multiprocessing模块)
day31 http://www.cnblogs.com/yuanchenqi/articles/5745958.html 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分 ...
随机推荐
- 51nod 1525 重组公司
题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有n个人在公司里面工作.员工从1到n编号.每一个人属于一个部门.刚开始每一个人在自 ...
- python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题
1. 重写一般方法和特殊的构造方法 1.1 如果一个方法在B类的一个实例中被调用(或一个属性被访问),但在B类中没有找到该方法,那么会去它的超类A里面找. class A: ... def hello ...
- UVA 1599, POJ 3092 Ideal Path 理想路径 (逆向BFS跑层次图)
大体思路是从终点反向做一次BFS得到一个层次图,然后从起点开始依次向更小的层跑,跑的时候选则字典序最小的,由于可能有多个满足条件的点,所以要把这层满足条件的点保存起来,在跑下一层.跑完一层就会得到这层 ...
- 手机屏幕材质详解(TFT,TPS,OLED,AMOLED等)
手机屏幕概括起来就是两种,一个是LCD,一个是OLED屏幕,这两个是屏幕显示技术的两大基础. 一 . LCD:Liquid Crystal Display,这是一种介于固态和液态之间的物质,称为液晶技 ...
- xpath定位和css定位对比
xpath定位和css定位对比 实际项目中使用较多的是xpath定位和css定位.XPath是XML文档中查找结点的语法,换句话就是通过元素的路径来查找这个元素.xpath比较强大,而css选择器 ...
- 在DataGridView控件中显示下拉列表
实现效果: 知识运用: DataGridViewComboBoxColumn类 //通过该类可以创建下拉列表样式的列 实现代码: private void Form1_Load(object send ...
- c3p0,dbcp和proxool
关于c3p0.dbcp和proxool,之类的比较,配置在网上有很多的文章,我这边就不浪费大家的时间了,主要讲下我用过这三个之后的体会. dbcp:框架以前使用的是dbcp,网上说,有很多BUG,至少 ...
- NIOP 膜你题
NOIp膜你题 Day1 duliu 出题人:ZAY 1.大美江湖(mzq.cpp/c) [题目背景] 细雪飘落长街,枫叶红透又一年不只为故友流连,其实我也恋长安听门外足音慢,依稀见旧时容颜 ...
- oracle 快速复制一张表,并在此创建索引,日志及并行度
复制表结构及其数据 create table table_name_new as select * from table_name_old 只复制表结构 create table table_name ...
- 03_10_Object类的toString equals等方法
03_10_Object类的toString equals等方法 1. toString方法 Object类中定义有public String toString()方法,其返回值是String类型,描 ...