Python:如何组合流程轮询和非阻塞WebSocket服务器?

时间:2012-08-15 20:36:57

标签: python websocket multiprocessing message-queue tornado

我有个主意。编写一个基于WebSocket的RPC,它将根据下面的场景处理消息。

  1. 客户端连接到WS(Web套接字)服务器
  2. 客户端向WS服务器发送消息
  3. WS服务器将消息放入传入队列(可以是多处理.Queue或RabbitMQ队列)
  4. 进程池中的一名工作人员选择要处理的消息
  5. 正在处理消息(可能非常快或极慢 - 它与WS服务器无关)
  6. 处理完邮件后,处理结果将被推送到外派队列
  7. WS服务器从队列中弹出结果并将其发送到客户端
  8. 注意:关键点是WS服务器应该是非阻塞的,并且只对以下内容负责:

    • 连接接受
    • 从客户端获取消息并将其放入传入队列
    • 从派出队列中弹出消息并将其发送回客户端

    注2:以某种方式存储客户端标识符并使​​用来自客户端的消息传递它可能是一个好主意

    注3:完全没问题,因为来回对消息进行排队,简单消息处理的速度(例如,将消息作为输入并将其作为结果推回)将变得更低。目标目标是能够在池中运行处理器昂贵的操作(粗略的非实际示例:几个嵌套的“for”循环),其代码样式与处理快速消息相同。即从输入队列中弹出消息以及某种客户端标识符,处理它(可能需要一段时间)并将处理结果与客户端ID一起推送到输出队列。

    问题:

    • 在TornadoWeb中,如果我有一个队列(多处理或Rabit),怎么可能 只要有新东西,我就会让Tornado的IOLoop触发一些回调 该队列中的项目?你能导航我一些现有的吗? 如果有任何实现?
    • 这样的设计是否已经准备就绪? (不一定是龙卷风)
    • 也许我应该使用另一种语言(而不是python)来实现这样的设计?

    致谢:

    • 建议不要将REST和WSGI用于我想要实现的任何目标
    • 评论“这是我通过谷歌搜索2秒找到的代码的链接。它有一些来自龙卷风和多处理的进口。我不知道它做了什么,但是99%肯定它确实是你所需要的“不欢迎
    • 使用异步库而不是普通阻塞库的建议是...... :)

1 个答案:

答案 0 :(得分:1)

Tornado的IOLoop允许您通过文件描述符处理来自任何文件对象的事件,因此您可以尝试这样做:

  • 通过multiprocessing.Pipe
  • 与您的每个工作流程建立联系
  • 为每个管道的父端调用add_handler(使用连接的fileno()
  • 每当他们将某些东西放入输出队列时,无论是multiprocessing.Queue是什
  • 处理事件处理程序中的工作人员的答案