2010-09-13 164 views
0

我有一個腳本接收來自套接字的數據,每個數據包含一個必須跟蹤的sessionid,foreach輸入消息,我打開一個新的進程與多處理模塊,我有麻煩找出一種方法來跟蹤具有相同sessionid的新傳入消息。例如:Python多處理處理會話

100100 |你好 -

(打開新的進程)

100100 |你好回你

(proccess回覆)

100101 |您好

(打開新過程)

100101 |你好,回來在你

(新程序回覆)

100100 | wasap? -

(打開新的進程)

當從會話ID 100100新的消息來... ...我怎麼會發送到正在處理的特定郵件的過程?

直到知道主進程正在爲每個輸入消息打開一個新進程時,另一個進程正在將數據寫入套接字,但卻讓我很難找到處理每個進程並向其發送數據的方法。

我需要一些指導會導致從未與多前工作...

謝謝...

回答

0

如何存儲在字典中的流程?例如。在僞代碼中:

def __init__(self): 
    self.sessions = {} 
def handle(self, sessionid, data): 
    proc = self.sessions.get(sessionid) 
    if prod is None: 
     proc = self.create_process() 
     self.sessions[sessionid] = proc 
    proc.handle(data) 
0

我不確定是否需要爲從套接字接收的每條消息打開單獨的進程。我想,你有完成你提到的所有事情的理由。

我的理解是,您已經編寫了一個服務器端套接字,用於偵聽客戶端連接,接受客戶端連接,接收數據並將這些數據分發到您創建的各個進程以處理這些消息。

我假設會話ID保持相同的客戶端連接。每個客戶端都發送帶有會話標識的數據。如果是這種情況,那麼你可以很容易地解決這個問題,在unix-forks重複文件/套接字描述符。當你啓動一個multiprocessing.Process()時,你可以將它傳遞給套接字描述符。確保關閉父進程中的套接字或偵聽客戶端連接的進程。通過這種方式,每個進程將處理連接,並將只接收標記了相同會話標識的單個客戶端的消息。

我希望這可以滿足您的需求。

+0

這些消息來與其他PARAMS像總長度,會話ID,日期,時間,ENTITY_ID,例如一個字符串「0066 | 100100 | 20100913 | 091213 | 25 |價值」,所以我怎麼能重定向所有消息以一個diferent過程與首先解析它? – 2010-09-13 12:38:08

1

要與創建的起始進程multiprocessing進行通信,您可以使用類QueuePipe(也來自多處理模塊)。下面是一個使用Queue將消息發送到一個處理的短例如:

from multiprocessing import Process, Queue 

def f(q): 
    print 'f(), waiting...' 
    print q.get() 

if __name__ == '__main__': 
    q = Queue() 
    p = Process(target=f, args=(q,)) 
    p.start() 
    q.put('Hello from main!') 
    p.join() 

更多informatin可以在Python docs找到。