如何在流程中更新类成员



我已经寻找了其他问题,这个未被接受的回答问题是我能找到的唯一一个以某种方式涵盖这个问题并且没有真正帮助的问题。此外,我需要它来处理进程,而不是线程。

因此,从一开始,我写了一个示例程序来显示我的问题,你应该能够粘贴它,它将运行:

import multiprocessing
import time 
class Apple:
def __init__(self, color):
self.color = color
def thinkAboutApple(apple):
while True:
print(apple.color)
time.sleep(2)
my_apple = Apple("red")
new_process = multiprocessing.Process(target=thinkAboutApple, args=(my_apple,))
new_process.start()
time.sleep(4)
print("new: brown")
my_apple.color = "brown"
#so that the program doesn't exit after time.sleep(4)
while True:
pass
# actual output | # wanted output
red             | red
red             | red
new: brown      | new: brown
red             | brown
red             | brown

这告诉我,要么苹果处于一个奇怪的假设中,它同时是两种颜色,要么新工艺的苹果在ram中处于另一个位置,并在主工艺中与苹果分离。

所以问题是:有没有一种方法可以让进程中的苹果指针指向同一个苹果,或者有什么蟒蛇般的方法可以让所有进程中的所有苹果实例都相同?如果我在很多过程中都有相同的苹果,甚至更多的过程中没有苹果,我该如何确保它们的面积始终相同?

您可以从(未记录的(multiprocessing.managers.NamespaceProxy类派生multiprocessing.BaseManager使用的Proxy类的专用版本,该类与基类不同,公开其所有方法和属性。这与@shtse8对链接的重复问题的回答类似,但我在这里发布了一个可运行的答案,以明确如何做到这一点。

from multiprocessing import Process
from multiprocessing.managers import BaseManager, NamespaceProxy
import time
import types
class MyManager(BaseManager): pass  # Avoid namespace pollution.
class Apple:
def __init__(self, color):
self.color = color

def Proxy(target):
""" Create a derived NamespaceProxy class for `target`. """
def __getattr__(self, key):
result = self._callmethod('__getattribute__', (key,))
if isinstance(result, types.MethodType):
def wrapper(*args, **kwargs):
self._callmethod(key, args)
return wrapper
return result
dic = {'types': types, '__getattr__': __getattr__}
proxy_name = target.__name__ + "Proxy"
ProxyType = type(proxy_name, (NamespaceProxy,), dic)  # Create subclass.
ProxyType._exposed_ = tuple(dir(target))
return ProxyType

AppleProxy = Proxy(Apple)

def thinkAboutApple(apple):
while True:
print(f"apple.color: {apple.color}")
time.sleep(1)

if __name__ == '__main__':
MyManager.register('Apple', Apple, AppleProxy)
manager = MyManager()
manager.start()
my_apple = manager.Apple("red")
new_process = Process(target=thinkAboutApple, args=(my_apple,))
new_process.start()
time.sleep(2)  # Allow other process to run a short while.
my_apple.color = "brown"  # Change shared class instance.
time.sleep(2)  # Allow other process to run at little while longer.
new_process.terminate()

相关内容

  • 没有找到相关文章

最新更新