2010-09-13 130 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找到。