最近有个小课题,需要用到双进程,翻了些资料,还算圆满完成任务。记录一下~

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)的更多相关文章

  1. Python 多进程 multiprocessing.Pool类详解

    Python 多进程 multiprocessing.Pool类详解 https://blog.csdn.net/SeeTheWorld518/article/details/49639651

  2. Python多进程multiprocessing使用示例

    mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multipr ...

  3. Python 多进程multiprocessing

    一.python多线程其实在底层来说只是单线程,因此python多线程也称为假线程,之所以用多线程的意义是因为线程不停的切换这样比串行还是要快很多.python多线程中只要涉及到io或者sleep就会 ...

  4. python ---多进程 Multiprocessing

    和 threading 的比较 多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 ...

  5. python多进程-----multiprocessing包

    multiprocessing并非是python的一个模块,而是python中多进程管理的一个包,在学习的时候可以与threading这个模块作类比,正如我们在上一篇转载的文章中所提,python的多 ...

  6. python多进程multiprocessing Pool相关问题

    python多进程想必大部分人都用到过,可以充分利用多核CPU让代码效率更高效. 我们看看multiprocessing.pool.Pool.map的官方用法 map(func, iterable[, ...

  7. 操作系统OS,Python - 多进程(multiprocessing)、多线程(multithreading)

    多进程(multiprocessing) 参考: https://docs.python.org/3.6/library/multiprocessing.html 1. 多进程概念 multiproc ...

  8. python多进程multiprocessing模块中Queue的妙用

    最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...

  9. Python(多进程multiprocessing模块)

    day31 http://www.cnblogs.com/yuanchenqi/articles/5745958.html 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分 ...

随机推荐

  1. OSSIM安装与使用感受

    下载地址 http://www.alienvault.com OSSIM通过将开源产品进行集成,从而提供一种能够实现安全监控功能的基础平台.它的目标是提供一种集中式.有组织的,能够更好地进行监测和显示 ...

  2. win10 ,本地连接无法识别网络 ,无线正常,

    win10 ,本地连接无法识别网络  ,无线正常, 电脑诊断是:“此计算机上缺少一个或者多个网络协议” 1.手动设置ip                          失败 2.网卡卸载驱动   ...

  3. 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows

    题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...

  4. 弄了一个星期的wp 8.1,吐血的感觉

    看到8.1出来这么久了,心痒难耐,忍不住想重新把应用写一遍,于是上个星期开始动手,用的mvvm模式,结果一路下来,sqlce不能用了,那好吧,我用sqlite,webrequest变成httpclie ...

  5. codeforce Gym 100500H ICPC Quest (简单dp)

    题意:给一个nXm的矩阵,上面有一些数字,从左上角出发,每次只能往右或者往下,把沿途的数字加起来,求到达右下角的最大值是多少. 题解:简单的一个dp,设f[i][j]为到达i行j列的最大值,f[i][ ...

  6. Windows无法停用设备,原因是某个程序正在使用它...

    有时候,当我们用完U盘需要弹出是,会出现“Windows无法停用设备,原因是某个程序正在使用它…”的黄色警告,很无奈.不过可以通过一些方法进行解决(win10版): 1. 打开“文件资源管理器”,选择 ...

  7. Vmware 安装CentOS7时连不上网问题的解决

    在VmWare 上安装Centos7时,装好vmware后还是连不上网,通过查找资料原来是因为有线网卡没有激活,默认centos和redhat7都是不启用有线网卡的,要么手动开启,要么安装时直接启用! ...

  8. java HashMap 内存泄漏

    import java.util.HashMap; import java.util.Map; public class HashMapOver { public static void main(S ...

  9. java利用SuffixFileFilter统计目录下特定后缀名文件的数目

    /** * 文件处理类 * @author zhangcd * @date 2017年1月3日 */ public class FileUtil { /** * 得到所有后缀的数目 * * @para ...

  10. iOS 导航栏遮挡问题 --- iOS开发系列 ---项目中成长的知识七

    不知大家有没有遇见过自己写的tableview被导航栏遮挡住的问题,反正我是遇见过! 因为在ios7以后所有的UIViewController创建后默认就是full Screen的,因此如果带导航栏的 ...