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

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. fiddler 模拟发送post请求

    打开fiddler,选择在右边的Composer工具栏,打开Parsed选项,然后数据发送协议,例如选择POST, POST右边输入框可以输入访问地址, 下方的输入框可以输入发送的输入操作,例如发送的 ...

  2. cocos2dx 3.x lua 网络加载并且保存资源(unix、linux)

    #ifndef __DazzleParkour__TextLoader__ #define __DazzleParkour__TextLoader__ #include <stdio.h> ...

  3. 前端开发面试题之JavaScript(转自公众号)(1)

    js基本数据类型:Undefine Number Null Boolean String; js内置对象:数据封装类对象:object.Array.Boolean.String: 其他:Functio ...

  4. NOIP模拟赛 篮球比赛1

    篮球比赛1(basketball1.*) Czhou为了提高机房里各种神牛的身体素质,决定在每次训练后举行篮球比赛.为了保持比赛公平,Czhou要将神牛们分成两队.首先神牛们赛前都要排成固定的队伍:然 ...

  5. 当c++遇上音乐

    运用到的函数 #include <windows.h> Beep( f, t ); Sleep( t ); eep() 函数可以让蜂鸣器发出频率为f赫兹,音长大约为 2t 毫秒的音.(注意 ...

  6. 【贪心】bzoj1577: [Usaco2009 Feb]庙会捷运Fair Shuttle

    一类经典的线段贪心 Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i ...

  7. k8s 基于NFS部署storageclass pv自动供给

    在k8s中部署有状态应用时,通常需要做数据持久化存储. 后端存储的方式有以下几种: 1.基于宿主机本地的存储方式: (重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节 ...

  8. Ubuntu 开机启动不执行

    解决方案: 1.将/etc/rc.local的命令改成更加兼容的模式,将"#!/bin/sh"改为"#!/bin/bash" 2.将/bin/sh重新链接到/b ...

  9. v2ex站长专访 - 100offer专访Livid:不仅仅是V站站长

    转载自: https://www.douban.com/group/topic/121611313/ 前几天上网时偶然发现v2ex站长的blog(https://livid.v2ex.com/),了解 ...

  10. GoF23种设计模式之行为型模式之观察者模式

    一.概述        定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.二.适用性1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面的时 ...