今天在测试多进程时, 发现了一个问题html
测试代码:python
#coding: utf8 from multiprocessing import Process import os print('Global_print', os.getpid()) def run_proc(name): print('Run child process %s (%s)…' % (name, os.getpid())) if __name__=='__main__': p = Process(target=run_proc, args=('test',)) print(os.getpid()) p.start()
上述代码不复杂, 肉眼就能猜出八九分: 父进程来执行了首尾的两个print
, 而子进程则只执行run_proc
,linux
下面就这针对这一个猜想来验证:segmentfault
在LInux
下,windows
'Global_print', 14382 14382 Run child process test (14383)…
很符合咱们的预期, 由于两次os.getpid()
获得了同样的结果, 而子进程的那句输出也从侧面验证了另外两句print
是父进程执行的.centos
接下来看下Windows
:安全
What ???...黑人问号..这是什么鬼..分分钟被打脸...函数
在测试了debian/centos
等等 unix/linux
不一样发行版和不一样Python
版本, 表现均为一致, 也就是上面Linux
的输出.测试
然而..在Windows
下也也是很顽固的和上面的输出不一致..spa
总所周知, Windows
和 Linux
在实现多进程上面是有点区别的..
因而, 感受应该是Windows
自身的问题, 在咨询了大佬以后, 得知官网早已有对这块进行说明了:
传送门: https://docs.python.org/2/lib...
摘抄资料以下:
简单的意思应该是下面这样:
由于Windows
缺少linix那种fork
, 因此它会有一些额外的限制:
target
, 相反应该要用普通的函数代替Python解析器
或者建立新process
时, 肯定主模块可以安全的导入.而刚才的那个问题, 就是由于没有注意到第三点, 因此致使了意想不到的的反作用
, 应该用下面的写法取代上面的不安全写法:
from multiprocessing import Process, freeze_support def foo(): print 'hello' if __name__ == '__main__': freeze_support() p = Process(target=foo) p.start()
果真..Windows
无处不在都在挖坑....
欢迎各位大神指点交流, QQ讨论群: 258498217
转载请注明来源: https://segmentfault.com/a/11...