繁体   English   中英

配置多重处理

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM