[英]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.