配置multiprocessing.Process

时间:2015-06-02 13:35:28

标签: python multithreading

我有一个名为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读取。然后,主进程可以为给定端口添加数据,线程可以使用该数据来更新响应者。我是在正确的轨道上吗?

我被迫在自己的过程中实现我的网络。

1 个答案:

答案 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,我从未使用过它,但我认为它只针对像这样的情况设计。