我有一个名为Sim
的多处理.Process,它有以下运行方法:
def run():
self.servers = [TcpServer(p, resps[p].get) for p in ports]
for s in self.servers: s.start()
self.event.wait()
for s in self.servers: s.stop()
TcpServer
继承自threading.Thread。
resps
是每个端口的响应者字典。响应者的get方法示例如下:
def get(data):
rsp = MyRsp()
rsp.a = 1
rsp.b = 1
rsp.c = 1
rsp.d = 1 if data[0] == 1 else 2
return rsp
我想要做的是在Sim
进程运行时更改响应者的行为,并且我希望从主进程执行此操作。例如,我可能想要更改上面的响应者,以便rsp.b = 2
代替。
请注意,响应者也可以拥有州:
class Rsp(object):
def __init__(self):
self.state = None
def get(data):
if data[0] = "update":
self.state = data[1]
return "updated"
else:
assert data[0] == "get"
return self.state
我怎么解决这个问题?我唯一的想法是在我的Sim
进程中运行一个额外的线程,该进程从multiprocessing.Queue读取。然后,主进程可以为给定端口添加数据,线程可以使用该数据来更新响应者。我是在正确的轨道上吗?
我被迫在自己的过程中实现我的网络。
答案 0 :(得分:0)
我不知道这是否有效,因为我不完全理解你想要做什么,但你可能会使用共享内存,例如共享数组:
from multiprocessing import Array
# Declare you shared array in your main
rsp=Array('f',4) # Create a (4,1) array of floats
# You need to pass the shared array as argument to the Processes that will need it
# to access data:
rsp.acquire() # Lock the shared memory to avoid conflicts. If already Locked by another Process, will also wait until memory is released.
a=rsp[0] # get the data or modify it like any other array
b=rsp[1]
...
rsp.release() # Release the Lock to allow other process the access
我不认为这是最漂亮的解决方案,但它可能会成功。您还应该看一下Multiprocessing.Manager
,我从未使用过它,但我认为它只针对像这样的情况设计。