廖雪峰网站学习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遇到的一些问题汇总的主要内容,如果未能解决你的问题,请参考以下文章

学习网站汇总

廖雪峰网站—学习python基础知识

廖雪峰网站—学习python基础知识

资料汇总:Python语言与机器学习以及深度学习

廖雪峰网站:学习python函数—递归函数

廖雪峰网站:学习python函数—函数参数