【问题标题】:Python multiprocessing handling sessionsPython 多处理处理会话
【发布时间】:2011-04-11 12:21:08
【问题描述】:

我有一个从套接字接收数据的脚本,每个数据都包含一个必须跟踪的 sessionid,foreach 传入消息,我正在使用多处理模块打开一个新进程,我无法找到方法跟踪具有相同 sessionid 的新传入消息。例如:

100100|你好——

(打开一个新进程)

100100|回你好

(进程回复)

100101|你好

(打开一个新进程)

100101|回你好

(新进程回复)

100100|黄蜂? --

(打开一个新进程)

当来自 sessionid 100100 的新消息出现时...我如何将其发送到处理这些特定消息的进程?

直到知道主进程正在为每个传入消息打开一个新进程,另一个进程正在套接字上写入数据,但是让我很难找到一种方法来处理每个会话进程并向它们发送数据......

我需要一些指导,因为之前从来没有使用过多处理......

谢谢...

【问题讨论】:

    标签: python session queue multiprocessing


    【解决方案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()
    

    更多信息请见Python docs

    【讨论】:

      【解决方案2】:

      我不确定是否需要为从套接字接收到的每条消息打开一个单独的进程。我想,你有理由做你提到的所有事情。

      我的理解是,您已经编写了一个服务器端套接字,用于侦听客户端连接、接受客户端连接、接收数据并将这些数据发送到您创建的用于处理这些消息的各个进程。

      我假设客户端连接的会话 ID 保持不变。每个客户端都发送带有其会话 ID 标记的数据。如果是这种情况,那么您可以通过在 unix 中分叉重复的文件/套接字描述符这一事实轻松解决。当您启动 multiprocessing.Process() 时,您可以将套接字描述符传递给它。确保关闭父进程或侦听客户端连接的进程中的套接字。这样,每个进程都将处理连接,并且只接收带有相同会话 ID 标记的单个客户端的消息。

      我希望这能满足您的需求。

      【讨论】:

      • 消息以带有其他参数的字符串形式出现到一个不同的进程而不先解析它?
      【解决方案3】:

      如何将进程存储在字典中?例如。在伪代码中:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2017-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多