gpt4 book ai didi

python - 跨进程共享对象状态?

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:29 29 4
gpt4 key购买 nike

在下面的代码中,如何使 Starter 对象能够读取 gen.vals?似乎创建了一个不同的对象,其状态得到更新,但 Starter 永远不知道这一点。另外,该解决方案如何适用于 self.vals 作为字典或任何其他类型的对象?

import multiprocessing
import time

class Generator(multiprocessing.Process):
def __init__(self):
self.vals = []
super(Generator, self).__init__()

def run(self):
i = 0
while True:
time.sleep(1)
self.vals.append(i)
print 'In Generator ', self.vals # prints growing list
i += 1

class Starter():
def do_stuff(self):
gen = Generator()
gen.start()
while True:
print 'In Starter ', gen.vals # prints empty list
time.sleep(1)

if __name__ == '__main__':
starter = Starter()
starter.do_stuff()

输出:

In Starter  []
In Starter []
In Generator [0]
In Starter []
In Generator [0, 1]
In Starter []
In Generator [0, 1, 2]
In Starter []
In Generator [0, 1, 2, 3]
In Starter []
In Generator [0, 1, 2, 3, 4]
In Starter []
In Generator [0, 1, 2, 3, 4, 5]
In Starter []
In Generator [0, 1, 2, 3, 4, 5, 6]
In Starter []
In Generator [0, 1, 2, 3, 4, 5, 6, 7]

最佳答案

当你启动一个进程时,它本质上是在一个完全独立的上下文中执行的(这里有一个 brief explanation 说明正在发生的事情),因此没有共享内存可言,因此无论你的 run()方法并没有真正反射(reflect)在你的主进程中 - Python 从中生成/ fork 出一个全新的进程,在那里实例化你的 Generator 并调用它的 run() 方法,不同进程中其他实例的状态的任何更改都会保留在那里。

如果您想传递数据,则需要使用一些多处理感知结构,这些结构本质上会在不同进程之间序列化/反序列化数据,并来回传递更改。例如:

import multiprocessing
import time

class Generator(multiprocessing.Process):
def __init__(self):
self._vals = [] # keeps the internal state
self.vals = multiprocessing.Queue() # a queue for the exchange
super(Generator, self).__init__()

def run(self):
i = 0
while True:
time.sleep(1)
self._vals.append(i) # update the internal state
print('In Generator ', self._vals) # prints growing list
self.vals.put(self._vals) # add it to the queue
i += 1

class Starter():
def do_stuff(self):
gen = Generator()
gen.start()
while True:
print('In Starter ', gen.vals.get()) # print what's in the queue
time.sleep(1)

if __name__ == '__main__':
starter = Starter()
starter.do_stuff()

将打印出:

In Generator  [0]In Starter  [0]In Generator  [0, 1]In Starter  [0, 1]In Generator  [0, 1, 2]In Starter  [0, 1, 2]In Generator  [0, 1, 2, 3]In Starter  [0, 1, 2, 3]etc.

如果你想做更复杂/半并发的数据修改或者处理更结构化的数据,请检查 multiprocessing.Manager 支持的结构。当然,对于非常复杂的东西,我总是建议使用内存数据库,例如 Redis作为进程间数据交换的手段。或者,如果您喜欢自己进行微观管理,ØMQ总是一个不错的选择。

关于python - 跨进程共享对象状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44611242/

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