廖雪峰网站学习python遇到的一些问题汇总
Posted ybyjforever
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了廖雪峰网站学习python遇到的一些问题汇总相关的知识,希望对你有一定的参考价值。
问题1:在学习分布式进程的时候,遇到了一个问题,其官网的代码运行环境是在搭建在linux平台下的,而相同的代码在windows下会产生不一样的结果。
QueueManager.register(‘get_task_queue‘, callable=lambda: task_queue) QueueManager.register(‘get_result_queue‘, callable=lambda: result_queue)
因为linux下创建进程使用的是fork(),而windows平台下创建进程使用是CreateProccess()。fork()调用之后,没有写操作之前,与父进程共享一份内存,并没有真正拥有所谓多进程的“私有内存”。而CreateProccess()每次执行之后,都确保子进程拥有新的内存空间。这样设计的原因可以从linux和windows多进程的应用场景的差别来理解:fork诞生于无线程时代,因此fork()之后不exec的话,作用与多线程非常相似,可以理解为没有线程概念下的一种解决方案。而CreateProccess则更像创建兄弟进程,创建的进程都保证独立存在。这种差别直接体现在multiprocessing模块当中,在不同平台下使用不同的方法创建例子中的manager进程。在windows下通过将父进程的环境进行序列化存储之后,再传入createProccess当中。问题在于pickling序列化中对匿名函数的不支持,导致创建进程失败。因此把匿名函数用函数替代即可解决。.
# 替代原来的匿名函数 def return_task_queue(): global task_queue return task_queue # 替代原来的匿名函数 def return_result_queue(): global result_queue return result_queue # callable参数指定函数 QueueManager.register(‘get_result_queue‘,callable=return_result_queue) # callable参数指定函数 QueueManager.register(‘get_result_queue‘,callable=return_result_queue)
同时,windows平台下需要加入if name == main:判断,防止循环import
以上是关于廖雪峰网站学习python遇到的一些问题汇总的主要内容,如果未能解决你的问题,请参考以下文章