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中的多线程其实并不是真正的多线程,如果想要充分 ...
随机推荐
- MovieReview—Coco(寻梦环游记)
Dream & Family The protagonist in the movie is hard to choose between family and dream. ...
- AJAX不能访问MVC后台程序的问题
AJAX不能访问后台的MVC有可能是MVC的后台程序加入了身份验证[Authorize]标记,这样前台的AJAX虽然结果显示的是4和200但是responsetext的值可以看到是返回了一个配置文件中 ...
- WINDOWS-基础:LPTSTR
1. LPTSTR解释 与char*等价,表示普通字符/字符串变量,指向字符/字符串的指针. LP: 长指针(long pointer). T: win32环境中有一个_T宏,用来标识字符是否采 ...
- sqlite 新建实体时出错
解决方式 手动下载 问题原因
- 响应者链和Hit-Test 机制
概念: 响应者 : 对用户交互动作事件进行响应的对象.响应者链:成为处理事件的响应者的先后顺序链. 1.Hit-Test 机制 当用户触摸(Touch)屏幕进行交互时,系统首先要找到响应者(Respo ...
- R,RJAVA 安装配置 详细版
准备工作 系统必须已经安装JDK 并配置好了环境变量. 注:安装的jdk r 以及系统 尽量保持位数一致 1.下载 R https://mirrors.tuna.tsinghua.edu.cn ...
- FTP服务-实现vsftpd虚拟用户
前几篇介绍了基础,这篇将具体实现几个案例 实现基于文件验证的vsftpd虚拟用户,每个用户独立一个文件夹 1.创建用户数据库文件 vim /etc/vsftpd/vusers.txt qq cento ...
- Oracle 数据库常用SQL语句(1)
一.数据定义语句 CREATE:创建表或其它对象 create database test; //创建test数据库 ),sex )); //创建表 ALTER:修改表或其它对象的结构 )); //为 ...
- ipvsadm启动报错解决方法
Centos7 yum -y install ipvadm 安装后,启动ipvsadm却报错. Redirecting to /bin/systemctl start ipvsadm.service ...
- destoon 自定义session丢失
destoon 在使用session之前 应该实例化 $session = new dsession(); destoon通过配置文件加载了不同session存储方式.如果你使用session的页面 ...