[英]Configuring a multiprocessing.Process
我有一个名为Sim
的multiprocessing.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
进程运行时更改响应者的行为,我希望从Main进程中做到这一点。 例如,我可能想更改上述响应器,以使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中读取。 然后,主进程可以为线程可以用来更新响应程序的给定端口添加数据。 我在正确的轨道上吗?
我被迫在自己的流程中实施我的网络。
我不知道这是否行得通,因为我不完全了解您要尝试执行的操作,但是您可能会使用共享内存,例如共享数组:
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
,我从未使用过它,但我认为它只是为这种情况而设计的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.