gpt4 book ai didi

Python多处理,传递包含信号量的对象引用

转载 作者:太空狗 更新时间:2023-10-29 22:04:17 25 4
gpt4 key购买 nike

我有这样一个场景:我已经创建了一个包含信号量的类元素的对象。

import multiprocessing as mpr

class Element(object):
def __init__(self):
self.sem = mpr.Semaphore()
self.xyz = 33

def fun( ch ):
a = ch.recv()
print( a[0] )
print( a[1].xyz )
a[1].xyz = 99
print( a[1].xyz )


el = Element()

( pa , ch ) = mpr.Pipe()
proc = mpr.Process(target=fun , args=( ch, ) )

proc.start()
pa.send( [ "Hallo" , el ])

print( el.xyz )

proc.join()

此代码返回此错误:

  File "/usr/lib/python2.7/multiprocessing/forking.py", line 51, in assert_spawning
' through inheritance' % type(self).__name__
RuntimeError: Semaphore objects should only be shared between processes through inheritance

但是如果我从 Element 的声明中删除信号量,代码可以工作,但是分配给 a[1].xyz 的值将会丢失。

现在我需要通过 semphore 和 multiprocessing 来同步一个大的对象集合。 那么有一些方法可以在每个对象中设置一个信号量并只传递对主对象的引用吗?

import multiprocessing as mpr

class Element(object):
def __init__(self):
self.xyz = 33

def fun( ch ):
a = ch.recv()
print( a[0] )
print( a[1].xyz )
a[1].xyz = 99
print( a[1].xyz )


el = Element()

( pa , ch ) = mpr.Pipe()
proc = mpr.Process(target=fun , args=( ch, ) )

proc.start()
pa.send( [ "Hallo" , el ])

print( el.xyz )

proc.join()

第二个版本不会产生任何错误,但是分配给 a[1].xyz = 99 的值将在主进程中丢失。

最佳答案

我认为您不了解 multiprocessing 模块的工作原理。

当你通过管道发送一些东西时,它会在子进程中被 pickle 和 unpickled。这意味着子进程实际上有一个原始对象的副本!这就是更改“丢失”的原因。添加信号量不会改变任何东西。

如果你想要共享内存中的对象,你应该使用multiprocessing.Value ,即使这不处理任意类型。大概 multiprocessing.Manager正是您要找的。

另一种方法是向提供修改对象的主进程发送响应。

关于Python多处理,传递包含信号量的对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12974414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com