【发布时间】:2022-01-02 16:57:10
【问题描述】:
例如,我有一个 Event 类,看起来像
class Event:
def __init__(self):
self.events = dict()
def on(self, name, callback):
self.events[name] = callback
def emit(self, name):
callback = self.events[name]
if callable(callback):
callback()
当我尝试在主线程中使用它时,它可以工作。
if __name__ == "__main__":
event = Event()
event.on("hello", lambda: print("hello world"))
event.emit("hello") # OUTPUT: hello world
但是当我尝试在另一个进程中注册我的事件时,它并没有改变,而是同一个进程。我已经定义了两个函数,其中一个设置新事件,另一个发出该事件。然后在不同的进程上运行这些函数。
def soldier(e):
e.on("hello", lambda: print("hello world"))
def officer(e):
e.emit("hello")
if __name__ == "__main__":
event = Event()
process1 = Process(target=officer, args=(event,))
process2 = Process(target=soldier, args=(event,))
process1.start()
process2.start()
process1.join()
process2.join()
预期结果与上面没有进程的示例相同,但由于第一个进程仅在其内部更改 event.events 的值,并且更改的值在进程外部不可见,因此出现错误。
如何在进程外查看自定义类对象的变化值?
【问题讨论】:
-
进程和线程在这方面有很大的不同,所以答案取决于你问的是哪一个——否则你的问题就太宽泛了。
-
只是我在线程上尝试过同样的方法,但对进程更感兴趣
-
进程更复杂,因为它们每个都在自己的内存空间中运行,所以没有真正的全局变量可以“共享”(与线程不同)。有几种不同的解决方法,其中一种是使用协调并发访问资源的“代理”。例如,请参阅我对Working with deque object across multiple processes 的回答。
标签: python multiprocessing python-multithreading