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

转载于:https://www.cnblogs.com/ybyjforever/p/9987457.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值