博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python: Windows下用multiprocessing的深坑
阅读量:5891 次
发布时间:2019-06-19

本文共 1250 字,大约阅读时间需要 4 分钟。

今天在测试多进程时, 发现了一个问题

测试代码:

#coding: utf8from 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下,

'Global_print', 1438214382Run child process test (14383)…

很符合我们的预期, 因为两次os.getpid()得到了一样的结果, 而子进程的那句输出也从侧面验证了另外两句print是父进程执行的.

接下来看下Windows:

clipboard.png

What ???...黑人问号..这是什么鬼..分分钟被打脸...

在测试了debian/centos等等 unix/linux不同发行版和不同Python版本, 表现均为一致, 也就是上面Linux的输出.

然而..在Windows下也也是很顽固的和上面的输出不一致..

总所周知, WindowsLinux在实现多进程上面是有点区别的..

于是, 感觉应该是Windows自身的问题, 在咨询了大佬之后, 得知官网早已有对这块进行说明了:

传送门:

摘抄资料如下:

clipboard.png

简单的意思应该是下面这样:

因为Windows缺乏linix那种fork, 所以它会有一些额外的限制:

  • 不管是绑定还是未绑定的方法, 都不要直接作为参数传给Process初始化的target, 相反应该要用普通的函数代替
  • 子进程在访问全局变量时, 可能会与父进程的值不同. ( 模块级别的常量没这问题 )
  • 开启新Python解析器或者创建新process时, 确定主模块能够安全的导入.

而刚才的那个问题, 就是因为没有注意到第三点, 所以导致了意想不到的的副作用, 应该用下面的写法取代上面的不安全写法:

from multiprocessing import Process, freeze_supportdef foo():    print 'hello'if __name__ == '__main__':    freeze_support()    p = Process(target=foo)    p.start()

果然..Windows无处不在都在挖坑....

欢迎各位大神指点交流, QQ讨论群: 258498217

转载请注明来源:

你可能感兴趣的文章
人生, 不要在别扭的事上纠结
查看>>
C的面向对象编程
查看>>
日志服务器架构设计
查看>>
使用Unity开发Android的几种调试方法
查看>>
C++ 基础笔记(一)
查看>>
编译内核出错:invalid option `abi=aapcs-linux' 解决办法
查看>>
System.Func<>与System.Action<>
查看>>
[翻译] EnterTheMatrix
查看>>
asp.net开源CMS推荐
查看>>
我所思考的生活,致半年后的自己
查看>>
csharp skype send message in winform
查看>>
jQuery plugin: Tablesorter 2.0
查看>>
csharp:datagridview enter Half Width and Full Width characters
查看>>
MMORPG 游戏服务器端设计--转载
查看>>
C#实现无标题栏窗体点击任务栏图标正常最小化或还原的解决方法
查看>>
[转]GetLastInputInfo计时用户离开电脑及软件在指定时间锁定等
查看>>
Windows 操作系统与 .NET Framework
查看>>
Box2dの自定义多边形
查看>>
HDU 1425 ( sort )
查看>>
Windows Phone 7 框架和页面
查看>>