Python多进程处理会话
我有一个脚本,它从一个套接字接收数据,每条数据都有一个会话ID,我需要跟踪这个会话ID。对于每条进来的消息,我都会用多进程模块打开一个新进程,但我不知道怎么才能跟踪那些会话ID相同的新消息。举个例子:
100100|你好 --
(打开一个新进程)
100100|你好,回你一句
(这个进程回复)
100101|你好
(打开一个新进程)
100101|你好,回你一句
(新进程回复)
100100|怎么样? --
(打开一个新进程)
当会话ID为100100的新消息到来时……我该怎么把它发送给正在处理这些特定消息的进程呢?
到目前为止,主进程为每条进来的消息都打开一个新进程,另一个进程在套接字上写数据,但我真的很难找到一种方法来处理每个会话的进程并将数据发送给它们……
我需要一些指导,因为我之前从未使用过多进程……
谢谢……
3 个回答
我不太明白为什么每收到一个来自套接字的消息就要打开一个单独的进程。我想,你这样做一定有你的理由。
我的理解是,你写了一个服务器端的套接字,它会监听客户端的连接,接受客户端的连接,接收数据,然后把这些数据分发给你创建的各种进程来处理这些消息。
我假设每个客户端连接的会话ID是一样的。每个客户端发送的数据都会带上它的会话ID。如果是这样的话,你可以很简单地解决这个问题,因为在Unix系统中,fork会复制文件/套接字描述符。当你启动一个multiprocessing.Process()时,可以把套接字描述符传给它。确保在父进程或者监听客户端连接的进程中关闭套接字。这样每个进程就会处理这个连接,并且只会接收带有相同会话ID的单个客户端的消息。
希望这能满足你的需求。
你觉得把这些过程存放在一个字典里怎么样?比如说,下面这个伪代码:
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)
要和通过 multiprocessing
创建的进程进行沟通,你可以使用 Queue
和 Pipe
这两个类(它们也来自 multiprocessing 模块)。下面是一个简单的例子,展示了如何使用 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()
更多信息可以在 Python 文档 中找到。