Python3 线程

Windows下面的multiprocessing跟Linux下面略有不同,Linux下面基于fork,fork之后所有的本地变量都复制一份,因此可以使用任意的全局变量;在Windows下面,多进程是通过启动新进程完成的,所有的全局变量都是重新初始化的,在运行过程中动态生成、修改过的全局变量是不能使用的。multiprocessing内部使用pickling传递map的参数到不同的进程,当传递一个函数或类时,pickling将函数或者类用所在模块+函数/类名的方式表示,如果对端的Python进程无法在对应的模块中找到相应的函数或者类,就会出错。当你在Interactive Console当中创建函数的时候,这个函数是动态添加到main模块中的,在重新启动的新进程当中不存在,所以会出错。当不在Console中,而是在独立Python文件中运行时,你会遇到另一个问题:由于你下面调用multiprocessing的代码没有保护,在新进程加载这个模块的时候会重新执行这段代码,创建出新的multiprocessing池,无限调用下去。解决这个问题的方法是永远把实际执行功能的代码加入到带保护的区域中:

from multiprocessing import Pool
def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)
    r=pool.map(f, range(100))
    pool.close()
    pool.join() 

注意if __name__ == '__main__'这一行,当模块从import当中加载的时候这行保证下面的代码不会执行。

转自链接:https://www.zhihu.com/question/39032759/answer/107049302

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,738评论 0 13
  • 我跟着她的脚步走进了一座宅院中,这座宅院的年纪比我大出了好几十重,墙上的每一道痕里不知裹了多少年的雨和风,像一个阅...
    王书著阅读 1,868评论 0 0
  • 明天,明天还有明天吗?有谁能准确告诉我,我们明天在哪里? 我小心翼翼,千思万想,小心谨慎,战战赫赫,如履薄冰的去想...
    看得到我吗阅读 3,352评论 0 2
  • 今天的两个家风的智慧,教养,给我深深的感动,我想成为一个美丽,智慧,善良的人,懂得坚持为何物的人。 ...
    沐星之星星阅读 3,244评论 0 0
  • 最近好像陷入了知识焦虑,导致自己成了个疯狂囤积课程的仓鼠,每天想做的事情很多,真正做好的却很少。 前两天,听一位异...
    机会本人阅读 2,607评论 2 0

友情链接更多精彩内容