簡體   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