python多进程的理解 multiprocessing Process join run

时间:2021-10-21 08:17:55

最近看了下多进程。

一种接近底层的实现方法是使用 os.fork()方法,fork出子进程。但是这样做事有局限性的。比如windows的os模块里面没有 fork() 方法。

windows:python多进程的理解  multiprocessing  Process join run。linux:python多进程的理解  multiprocessing  Process join run

另外还有一个模块:subprocess。这个没整过,但从vamei的博客里看到说也同样有局限性。

所以直接说主角吧 --- multiprocessing模块。 multiprocessing模块会在windows上时模拟出fork的效果,可以实现跨平台,所以大多数都使用multiprocessing。

下面给一段简单的代码,演示一下创建进程:

#encoding:utf-8
from multiprocessing import Process
import os, time, random #线程启动后实际执行的代码块
def r1(process_name):
for i in range(5):
print process_name, os.getpid() #打印出当前进程的id
time.sleep(random.random())
def r2(process_name):
for i in range(5):
print process_name, os.getpid() #打印出当前进程的id
time.sleep(random.random()) if __name__ == "__main__":
print "main process run..."
p1 = Process(target=r1, args=('process_name1', )) #target:指定进程执行的函数,args:该函数的参数,需要使用tuple
p2 = Process(target=r2, args=('process_name2', )) p1.start() #通过调用start方法启动进程,跟线程差不多。
p2.start() #但run方法在哪呢?待会说。。。
p1.join() #join方法也很有意思,寻思了一下午,终于理解了。待会演示。
p2.join()
print "main process runned all lines..."

执行结果:

python多进程的理解  multiprocessing  Process join run

上面提到了两个方法:runjoin

run:如果在创建Process对象的时候不指定target,那么就会默认执行Process的run方法:

#encoding:utf-8
from multiprocessing import Process
import os, time, random def r():
print 'run method' if __name__ == "__main__":
print "main process run..."
#没有指定Process的targt
p1 = Process()
p2 = Process()
#如果在创建Process时不指定target,那么执行时没有任何效果。因为默认的run方法是判断如果不指定target,那就什么都不做
#所以这里手动改变了run方法
p1.run = r
p2.run = r p1.start()
p2.start()
p1.join()
p2.join()
print "main process runned all lines..."

另:python源码里,Process.run方法:

python多进程的理解  multiprocessing  Process join run

执行结果:

python多进程的理解  multiprocessing  Process join run

可见如果在实例化Process不指定target,就会执行默认的run方法。

还有一个join方法:

最上面演示的代码中,在调用Process的start方法后,调用了两次join方法。这个join方法是干什么的呢?

官方文档的意思是:阻塞当前进程,直到调用join方法的那个进程执行完,再继续执行当前进程。

比如还是刚才的代码,只是把两个join注释掉了:

#encoding:utf-8
from multiprocessing import Process
import os, time, random def r1(process_name):
for i in range(5):
print process_name, os.getpid() #打印出当前进程的id
time.sleep(random.random())
def r2(process_name):
for i in range(5):
print process_name, os.getpid() #打印出当前进程的id
time.sleep(random.random()) if __name__ == "__main__":
print "main process run..."
p1 = Process(target=r1, args=('process_name1', ))
p2 = Process(target=r2, args=('process_name2', )) p1.start()
p2.start()
#p1.join()
#p2.join()
print "main process runned all lines..."

执行结果:

python多进程的理解  multiprocessing  Process join run

发现主进程不像之前那样,等待两个子进程执行完了,才继续执行。而是启动两个进程后立即向下执行。

为了深刻理解,这次把p2的执行函数里面睡眠时间调大,让他多睡一会,然后保留p1的join,注释掉p2的join,效果更明显:

#encoding:utf-8
from multiprocessing import Process
import os, time, random def r1(process_name):
for i in range(5):
print process_name, os.getpid() #打印出当前进程的id
time.sleep(random.random())
def r2(process_name):
for i in range(5):
print process_name, os.getpid() #打印出当前进程的id
time.sleep(random.random()*2) if __name__ == "__main__":
print "main process run..."
p1 = Process(target=r1, args=('process_name1', ))
p2 = Process(target=r2, args=('process_name2', )) p1.start()
p2.start()
p1.join()
#p2.join()
print "main process runned all lines..."

执行结果:

python多进程的理解  multiprocessing  Process join run

发现主线程只是等待p1完成了,就会向下执行,而不会等待p2是否完成。

所以使用多进程的常规方法是,先依次调用start启动进程,再依次调用join要求主进程等待子进程的结束。

然而为什么要先依次调用start再调用join,而不是start完了就调用join呢,如下:

由:

p1.start()
p2.start()
p1.join()

改为:

p1.start()
p1.join()
p2.start()

执行效果:

python多进程的理解  multiprocessing  Process join run

发现是先执行完p1,再执行主线程,最后才开始p2。

今天上午一直困惑这个事,现在终于明白了。join是用来阻塞当前线程的,p1.start()之后,p1就提示主线程,需要等待p1结束才向下执行,那主线程就乖乖的等着啦,自然没有执行p2.start()这一句啦,当然就变成了图示的效果了。

python多进程的理解 multiprocessing Process join run的更多相关文章

  1. 进程 multiprocessing Process join Lock Queue

    多道技术 1.空间上的复用 多个程序公用一套计算机硬件 2.时间上的复用 cpu 切换程序+保存程序状态 1.当一个程序遇到IO操作,操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率,并且不 ...

  2. Python多进程multiprocessing使用示例

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

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

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

  4. 创建一个多进程(multiprocessing.Process)

    进程是资源的集合,每个进程至少包含一个线程 import multiprocessing #导入进程模块import time, threading #导入线程 def thread_run(): p ...

  5. 【转】Python多进程编程

    [转]Python多进程编程 序. multiprocessingpython中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Pytho ...

  6. Python 多进程编程之multiprocessing--Process

    Python 多进程编程之multiprocessing 1,Process 跨平台的进程创建模块(multiprocessing), 支持跨平台:windowx/linux 创建和启动      创 ...

  7. python多进程详解和协程

    1.由于python多线程适合于多IO操作,但不适合于cpu计算型工作,这时候可以通过多进程实现.python多进程简单实用 # 多进程,可以cpu保持一致,python多线程适合多io.对于高cpu ...

  8. python多进程总结

    概述 由于python中全局解释器锁(GIL)的存在,所以python多线程并不能有效利用CPU多核的性能(相当于单核并发)实现多线程多核并行,所以在对CPU密集型的程序时处理效率较低,反而对IO密集 ...

  9. Python 多进程异常处理

    前言 最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较‘重’的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较‘重’ ...

随机推荐

  1. ASP.NET后台获取cookie中文乱码解决办法

    项目中有一功能,需要从一个页面前台使用cookie保存json数据,并传递到第二个页面.要在第二个页面中获取cookie中的json的值,没有任何处理情况下,获取的字符串为乱码,就连符号都是乱码的.百 ...

  2. xhtml+css基础知识1

    样式 行间样式:在标签里 <div style="width:400px; height:200px; background:red;">块</div> 内 ...

  3. git stash

      https://git-scm.com/docs/git-stash   NAME git-stash - Stash the changes in a dirty working directo ...

  4. NLP入门(七)中文预处理之繁简体转换及获取拼音

      在日常的中文NLP中,经常会涉及到中文的繁简体转换以及拼音的标注等问题,本文将介绍这两个方面的实现.   首先是中文的繁简体转换,不需要使用额外的Python模块,至需要以下两个Python代码文 ...

  5. 当进行服务端渲染的时间,某些npm包可能会调用document,window这些对象而导致报错

    1.在didmount里面使用require引入 require.ensure([], (require) => { this.setState({ picker: require('./Pic ...

  6. 【转载】C&num;递归删除文件夹目录及文件

    在C#文件操作过程中,有时候需要删除相应目录,如果文件夹中含有其他文件夹或者文件,也需要一并进行删除,此时可能就需要使用递归来删除文件夹目录以及文件,递归过程中,如果遍历的对象是文件夹,则删除文件夹, ...

  7. UVa 11100 旅行2007

    https://vjudge.net/problem/UVA-11100 题意: 给定n个正整数,把它们划分成尽量少的严格递增序列,尽量均分. 思路: 因为必须严格递增,所以先统计每个数字出现的次数, ...

  8. Cockroachdb 二、手动部署

    二 集群手动部署 **需求** a 本地已安装CockroachDB b 可SSH访问每台机器,用于分发二进制文件和证书 c 端口 26257 用于集群内部通信及客户端访问连接HAProxy 8080 ...

  9. &lbrack;译转&rsqb;深入理解LayoutInflater&period;inflate&lpar;&rpar;

    原文链接:https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/ 译文连接:http://bl ...

  10. Oracle数据库PLSQL的中文乱码显示全是问号

    plsql连接数据库乱码问题 缘由: 小师妹周末叫我帮她重装数据库,这么大好的周末时光不出去玩儿,给她装数据库这不是很蛋疼么. 我问她为什么要重装,她说:数据存入数据库后,中文字符有乱码,一定是我上次 ...