资讯专栏INFORMATION COLUMN

Python: Windows下用multiprocessing的深坑

forrest23 / 1299人阅读

摘要:今天在测试多进程时发现了一个问题测试代码上述代码不复杂肉眼就能猜出八九分父进程来执行了首尾的两个而子进程则只执行下面就这针对这一个猜测来验证在下很符合我们的预期因为两次得到了一样的结果而子进程的那句输出也从侧面验证了另外两句是父进程执行的接

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

测试代码:

#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下,

"Global_print", 14382
14382
Run child process test (14383)…

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

接下来看下Windows:

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

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

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

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

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

传送门: https://docs.python.org/2/lib...

摘抄资料如下:

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

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

不管是绑定还是未绑定的方法, 都不要直接作为参数传给Process初始化的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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44606.html

相关文章

  • python学习笔记 - fork, multiprocessing

    摘要:近年来,人工智能的兴起使得更加火爆了。获取当前进程父进程的。但是唯一遗憾的是,函数只能在系统中使用,不能在系统中使用。因此在下,需要将其包含在中。则是立即返回一个可迭代对象。则是返回可迭代函数。 Python一直是一门对初学者非常友好的语言,在数据分析、Web 开发、网络安全、网络爬虫等方面应用广泛。近年来,人工智能的兴起使得 Python 更加火爆了。 我们在处理大量数据或者需要快速...

    littleGrow 评论0 收藏0
  • python大佬养成计划-----多进程

    摘要:多进程执行任务结束,创建进程和销毁进程是时间的,如果长度不够,会造成多线程快过多进程多线程执行任务结束,进程间通信生产者消费者模型与队列演示了生产者和消费者的场景。 进程 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势。而使用多进程(Multiprocess),则可以发挥多核的优势真正地提...

    zhangfaliang 评论0 收藏0
  • Python学习】windows环境不能用函数

    摘要:普通的函数调用,调用一次,返回一次,但是调用一次,返回两次,因为操作系统自动把当前进程称为父进程复制了一份称为子进程,然后,分别在父进程和子进程内返回。子进程永远返回,而父进程返回子进程的。 一、Before Python学习过程中,经常发现教程上讲的函数在本机上会报错: AttributeError: module object has no attribute *** 作为一个初学...

    googollee 评论0 收藏0
  • python大佬养成计划----分布式进程

    摘要:分布式进程在和中,应当优选,因为更稳定,而且,可以分布到多台机器上,而最多只能分布到同一台机器的多个上。由于模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。 分布式进程 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。 Pytho...

    honmaple 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<