python多进程的理解 multiprocessing Process join run
一种接近底层的实现方法是使用 os.fork()方法,fork出子进程。但是这样做事有局限性的。比如windows的os模块里面没有 fork() 方法。
windows:。linux:
另外还有一个模块:subprocess。这个没整过,但从vamei的博客里看到说也同样有局限性。
所以直接说主角吧 --- multiprocessing模块。 multiprocessing模块会在windows上时模拟出fork的效果,可以实现跨平台,所以大多数都使用multiprocessing。
下面给一段简单的代码,演示一下创建进程:
执行结果:
上面提到了两个方法:run 和join
run:如果在创建Process对象的时候不指定target,那么就会默认执行Process的run方法:
另:python源码里,Process.run方法:
执行结果:
可见如果在实例化Process时不指定target,就会执行默认的run方法。
还有一个join方法:
最上面演示的代码中,在调用Process的start方法后,调用了两次join方法。这个join方法是干什么的呢?
官方文档的意思是:阻塞当前进程,直到调用join方法的那个进程执行完,再继续执行当前进程。
比如还是刚才的代码,只是把两个join注释掉了:
执行结果:
发现主进程不像之前那样,等待两个子进程执行完了,才继续执行。而是启动两个进程后立即向下执行。
为了深刻理解,这次把p2的执行函数里面睡眠时间调大,让他多睡一会,然后保留p1的join,注释掉p2的join,效果更明显:
执行结果:
发现主线程只是等待p1完成了,就会向下执行,而不会等待p2是否完成。
所以使用多进程的常规方法是,先依次调用start启动进程,再依次调用join要求主进程等待子进程的结束。
然而为什么要先依次调用start再调用join,而不是start完了就调用join呢,如下:
由:
p1.start() p2.start() p1.join()
改为:
p1.start() p1.join() p2.start()
执行效果:
发现是先执行完p1,再执行主线程,最后才开始p2。
今天上午一直困惑这个事,现在终于明白了。join是用来阻塞当前线程的,p1.start()之后,p1就提示主线程,需要等待p1结束才向下执行,那主线程就乖乖的等着啦,自然没有执行p2.start()这一句啦,当然就变成了图示的效果了。
一种接近底层的实现方法是使用 os.fork()方法,fork出子进程。但是这样做事有局限性的。比如windows的os模块里面没有 fork() 方法。
windows:。linux:
另外还有一个模块:subprocess。这个没整过,但从vamei的博客里看到说也同样有局限性。
所以直接说主角吧 --- multiprocessing模块。 multiprocessing模块会在windows上时模拟出fork的效果,可以实现跨平台,所以大多数都使用multiprocessing。
下面给一段简单的代码,演示一下创建进程:
执行结果:
上面提到了两个方法:run 和join
run:如果在创建Process对象的时候不指定target,那么就会默认执行Process的run方法:
另:python源码里,Process.run方法:
执行结果:
可见如果在实例化Process时不指定target,就会执行默认的run方法。
还有一个join方法:
最上面演示的代码中,在调用Process的start方法后,调用了两次join方法。这个join方法是干什么的呢?
官方文档的意思是:阻塞当前进程,直到调用join方法的那个进程执行完,再继续执行当前进程。
比如还是刚才的代码,只是把两个join注释掉了:
执行结果:
发现主进程不像之前那样,等待两个子进程执行完了,才继续执行。而是启动两个进程后立即向下执行。
为了深刻理解,这次把p2的执行函数里面睡眠时间调大,让他多睡一会,然后保留p1的join,注释掉p2的join,效果更明显:
执行结果:
发现主线程只是等待p1完成了,就会向下执行,而不会等待p2是否完成。
所以使用多进程的常规方法是,先依次调用start启动进程,再依次调用join要求主进程等待子进程的结束。
然而为什么要先依次调用start再调用join,而不是start完了就调用join呢,如下:
由:
p1.start() p2.start() p1.join()
改为:
p1.start() p1.join() p2.start()
执行效果:
发现是先执行完p1,再执行主线程,最后才开始p2。
今天上午一直困惑这个事,现在终于明白了。join是用来阻塞当前线程的,p1.start()之后,p1就提示主线程,需要等待p1结束才向下执行,那主线程就乖乖的等着啦,自然没有执行p2.start()这一句啦,当然就变成了图示的效果了。