栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python-多处理全局变量更新未返回给父级

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python-多处理全局变量更新未返回给父级

当你

multiprocessing
用来打开第二个进程时,将创建一个具有自己全局状态的Python 全新实例。该全局状态不会共享,因此子进程对全局变量所做的更改对于父进程将是不可见的。

此外,提供的大多数抽象都

multiprocessing
使用
pickle
来传输数据。使用代理传输的所有数据必须是可腌制的 ; 包括a Manager提供的所有对象。相关报价(我的重点):

确保代理方法的参数可挑剔。

并且(在本

Manager
节中):

其他进程可以使用代理访问共享库。

Queue还需要可腌制的数据;文档没有这么说,但是通过快速测试可以确认:

import multiprocessingimport pickleclass Thing(object):    def __getstate__(self):        print 'got pickled'        return self.__dict__    def __setstate__(self, state):        print 'got unpickled'        self.__dict__.update(state)q = multiprocessing.Queue()p = multiprocessing.Process(target=q.put, args=(Thing(),))p.start()print q.get()p.join()

输出:

$ python mp.py got pickledgot unpickled<__main__.Thing object at 0x10056b350>

如果你真的不能腌制数据,一种可能对你有用的方法是找到一种将其存储为ctype对象的方法。然后可以将对内存的引用传递给子进程。对我来说这似乎很狡猾。我没做过 但这可能是你可能的解决方案。

在进行了更新之后,你似乎需要进一步了解的内部结构LORR。是LORR上课吗?你可以从中继承吗?它是其他东西的子类吗?它的MRO是多少?(尝试

LORR.__mro__
将其输出,然后将其发布。)如果它是纯python对象,则可能可以将其子类化,创建一个
__setstate__
和一个
__getstate__
以启用酸洗。

另一种方法可能是弄清楚如何从LORR实例中获取相关数据并通过简单的字符串将其传递。既然你说你确实只是想调用对象的方法,为什么不使用Queues来回发送消息呢?换句话说,是这样的(示意上):

Main Process   Child 1 Child 2    LORR 1  LORR 2 child1_in_queue     ->    get message 'foo'    call 'foo' methodchild1_out_queue    <-    return foo data stringchild2_in_queue        ->         get message 'bar' call 'bar' methodchild2_out_queue       <-


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/430193.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号