廖雪峰网站学习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

猜你喜欢

转载自www.cnblogs.com/ybyjforever/p/9987457.html