您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

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

并且(在本Manager节中):

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

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

import multiprocessing
import pickle

class 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 pickled
got 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' method
child1_out_queue    <-    return foo data string
child2_in_queue                   ->                    get message 'bar'
                                                        call 'bar' method
child2_out_queue                  <-           
python 2022/1/1 18:23:19 有471人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶