1、multiprocessing模块——跨平台版本的多进程模块

multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:

from multiprocessing import Process
import os #子进程要执行的代码
def run_proc(name):
print('Run child process %s (%s)…'%(name , os.getpid())) if __name__=='__main__':
print('parent process %s.'%os.getpid())
p=Process(target=run_proc,args=('test',))
print('Child process will start')
p.start()
p.join()
print('Child process end') parent process 14960.
Child process will start
Run child process test (12496)…
Child process end

上述代码的说明:

1、父进程的进程ID的获取,通过os.getpid()

2、创建子进程时,用到了语句

p=Process(target=run_proc,args=('test',))

只需传入一个执行函数的函数名(如上文的run_proc)和函数的参数(args,注意一个参数时括号中的逗号),如此构造一个Process实例,并用start()启动。

join()方法可以等待子进程结束后继续往下执行,通常用于进程间的同步。

2、Pool

如果要创建大量进程,可以通过进程池的方式批量创建子进程:

from multiprocessing import Pool
import os,time,random def long_time_task(name):
print('run task %s (%s)'%(name,os.getpid()))
start=time.time()
time.sleep(random.random()*3)
end=time.time()
print('task %s runs %.2fs'%(name,end-start)) if __name__=='__main__':
print('parent process %s '%os.getpid())
p=Pool(4)
for i in range(5):
p.apply_async(long_time_task,args=(i,))
print('Waiting for all subprocesses done…')
p.close()
p.join()
print('All subprocesses done')
parent process 5280
Waiting for all subprocesses done…
run task 0 (2768)
run task 1 (12844)
run task 2 (15340)
run task 3 (7612)
task 1 runs 0.33s
run task 4 (12844)
task 0 runs 1.45s
task 2 runs 2.01s
task 3 runs 2.91s
task 4 runs 2.89s
All subprocesses done

上述代码的说明:

1、对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()前必须先调用close(),调用close()后就不能再添加新的process了

2、输出结果中,task0,1,2,3是立即执行的,而task4要等前面的某个task执行完后才能执行,这是因为我们之前人为设置了Pool的大小为4,因此最多同时执行4个进程。这是人为根据需要制定的,并不是操作系统的限制,如果我们改为

p=Pool(5)

就可以同时跑5个进程。

Pool的默认大小是CPU的核数。

3、子进程subprocess

很多时候,子进程不是自身,而是一个外部进程。——暂未理解这句话啥意思

我们创建子进程后,还要控制子进程的输入和输出。

subprocess模块可以让我们非常方便地启动一个子进程,然后控制其输入输出。

举例:在Python代码中运行命令

nslookup www.python.org

来达到和命令行同时运行相同的效果。

import subprocess
print('$ nslookup www.python.org')
r=subprocess.call(['nslookup','www.python.org'])
print('Exit Code:',r)
$ nslookup www.python.org
��Ȩ��Ӧ��:
������: public1.114dns.com
Address: 114.114.114.114
����: dualstack.python.map.fastly.net
Addresses: 2a04:4e42:36::223
151.101.108.223
Aliases: www.python.org
Exit Code: 0

如果子进程还需要输入,则可以通过communicate()方法输入:

import subprocess
print('$nslookup www.python.org')
p=subprocess.Popen(['nslookup'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output,err=p.communicate(b'set q=mx\npython.org\nexit\n')
print(output.decode('utf-8'))
print('Exit Code:',p.returncode)

其中

p.communicate(b'set q=mx\npython.org\nexit\n')

相当于在命令行执行命令nslookup,然后手动输入:

set q=mx
python.org
exit

4、进程间通信

Python的multiprocessing模块提供了Queue、Pipes等多种方式来交换数据。

以Queue为例,在父进程中创建两个子进程,一个往Queue中写数据,另一个从Queue中读数据:

from multiprocessing import Queue,Process
import os,time,random #写数据进程要执行的代码
def write(q):
print('Process to write:%s'%os.getpid())
for value in ['A','B','C']:
print('put %s to queue'%value)
q.put(value)
time.sleep(random.random()) #读数据进程执行的代码
def read(q):
print('Process to read:%s'%os.getpid())
while True:
value=q.get(True)
print('Get %s from queue.'%value) if __name__=='__main__':
#父进程创建Queue并传给各个子进程
q=Queue()
pw=Process(target=write,args=(q,))
pr=Process(target=read,args=(q,))
#启动子进程pw,写入
pw.start()
#启动子进程pr,读取
pr.start() #等待pw结束
pw.join()
#pr进程里是死循环,无法自行终止,只能强行结束
pr.terminate()

结果:

Process to write:2696
put A to queue
Process to read:7944
Get A from queue.
put B to queue
Get B from queue.
put C to queue
Get C from queue.

在Unix/Linux下,multiprocessing模块封装了fork()调用,使我们不需要关注fork()的细节。由于Windows没有fork调用,因此multiprocessing需要模拟出fork的效果,父进程中所有Python对象都必须通过pickle序列化再传到子进程中去,所以如果multiprocessing在Windows下失效了,要先考虑是不是pickle失败了

2020.9.28 多进程multiprocess 进程池pool 子进程subprocess 进程间通信的更多相关文章

  1. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  2. Python多进程库multiprocessing中进程池Pool类的使用[转]

    from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...

  3. Python多进程库multiprocessing创建进程以及进程池Pool类的使用

    问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...

  4. [转]Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...

  5. Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...

  6. python 进程池pool简单使用

    平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ‘ ...

  7. python 使用进程池Pool进行并发编程

    进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到mu ...

  8. 多任务-进程之进程池Pool

    1.什么是池? 首先从字面上看,池代表着一个容器,用来承载着某些内容的容器,了解到这里,就对进程池有了一个初步的轮廓. 2.什么是进程池Pool? (1)利用现实中的事物来理解: 对于小白初学者,接触 ...

  9. Python 之并发编程之manager与进程池pool

    一.manager 常用的数据类型:dict list 能够实现进程之间的数据共享 进程之间如果同时修改一个数据,会导致数据冲突,因为并发的特征,导致数据更新不同步. def work(dic, lo ...

随机推荐

  1. python3 爬取深圳主板公司名称,公司网址

    需要阅读的文档: Requests:http://cn.python-requests.org/zh_CN/latest/user/quickstart.html BeautifulSoup:http ...

  2. 字节跳动 iOS Heimdallr 卡死卡顿监控方案与优化之路

    点这里申请 本文主要介绍Heimdallr对卡死.卡顿异常的监控原理,并结合长时间的业务沉淀发现的问题进行不断迭代和优化,逐步实现全面.稳定.可靠的历程. 作者:字节跳动终端技术--白昆仑 前言 卡死 ...

  3. SpringBoot使用异步线程池实现生产环境批量数据推送

    前言 SpringBoot使用异步线程池: 1.编写线程池配置类,自定义一个线程池: 2.定义一个异步服务: 3.使用@Async注解指向定义的线程池: 这里以我工作中使用过的一个案例来做描述,我所在 ...

  4. java 多线程 start方法 run方法 简单介绍。

    一 start开启一个多线程, run 只是一个内部的方法. package com.aaa.threaddemo; /* * start方法的作用? * 在 Java中启动多线程调用的是start方 ...

  5. 关于将px转换为vw vh的解决方案

    什么是vw(Viewport Width)和vh(Viewport Height)? vw和vh是前端开发中的一个动态单位,是一个相对于网页视口的单位. 系统会将视口的宽度和高度分为100份,1vw占 ...

  6. 【XR-2】伤痕

    不难发现,直接漫无目的地构造不是一个好的选择,因为我们并不知道选择四座城市方案的上界是什么,因此下面可以来先分析一下这个方案的上界. 首先可以考虑这使得这四个点的导出子图是强连通的方案数,但是经过尝试 ...

  7. NSLog输出格式及随机数

    NSLog输出格式及随机数 %@ 对象 %d, %i 整数 (%i和%d无差别,%i是老式写法,%d是新式写法而已.) %u 无符整形 %f 浮点/双字 %x, %X 二进制整数 %o 八进制整数 % ...

  8. yum本地源仓库安装报错 被锁定如何解决?

    yum安装报错被锁定如何解决 上图!!!!!如图的报错 解决方法: 是不是很简单 智商在地上摩擦~~~

  9. Linux远程访问及控制

    Linux远程访问及控制 目录 Linux远程访问及控制 一.SSH远程管理 1. SSH远程管理概述 2. OpenSSH概述 3. 配置OpenSSH服务端 4. sshd服务的验证方式 5. 使 ...

  10. Redis 学习笔记(五)高可用之主从模式

    上一节提到了 Redis 的持久性,也就是在服务器实例宕机或故障时,拥有再恢复的能力.但是在这个服务器实例宕机恢复期间,是无法接受新的数据请求.对于整体服务而言这是无法容忍的,因此我们可以使用多个服务 ...