2015-06-02 34 views
0

我有一个名为multiprocessing.Process其Sim有以下运行方法:从threading.Thread配置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继承。

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进程运行时改变一个响应者的行为,我想从主过程做到这一点。例如,我可能想更改上述响应者,以便改为​​。

注意,响应者也可以有状态:

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进程中运行一个附加线程,该进程从多处理.Queue读取。然后主进程可以添加给定端口的数据,线程可以使用它来更新响应者。我在正确的轨道上吗?我不得不在自己的过程中实施我的网络。

+0

我对网络部分并不熟悉,但是如果你需要改变的变量有一个固定的类型,你可以把它们放在'multiprocessing.Array'中,这是一个共享变量。您还应该使用内置的Lock来访问它。如果你认为这可能有效,我可以开发这个想法 – CoMartel

+0

@HarryPotfleur是的,我希望看到你发展你的想法,请! – Baz

回答

0

我不知道这是否会工作,因为我不完全理解你的AR想做什么,但你可能会使用共享内存,如共享的阵列:

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,我从来没有使用它,但我认为它只是为这种情况设计的。

相关问题