【问题标题】:Streaming Connection Using Python Bottle, Multiprocessing, and gevent使用 Python Bottle、Multiprocessing 和 gevent 进行流式连接
【发布时间】:2012-10-30 09:28:29
【问题描述】:

我有一个 Bottle 应用程序,它使用子流程来完成请求的大部分工作。对于返回单个响应的路由,我会执行以下操作。

@route('/index')
def index():
    worker = getWorker()
    return worker.doStuff()

我的一条路线需要是数据流。我想不出一种让工作人员返回响应流的聪明方法。下面的例子和我想做的类似,只是没有工人。

@route('/stream')
def stream():
    yield 'START'
    sleep(3)
    yield 'MIDDLE'
    sleep(5)
    yield 'END'

我希望能够执行以下操作。由于我无法产生/返回生成器,因此这是不可能的。

@route('/stream')
def stream():
    worker = getWorker()
    yield worker.doStuff()
class worker:
    # Remember, this is run in a subprocess in real life.
    def doStuff():
        yield 'START'
        sleep(3)
        yield 'MIDDLE'
        sleep(5)
        yield 'END'

这是一个大型项目,我做事的方式没有太大的灵活性。我知道有时最简单的答案是“你的设计是错误的”。但在这种情况下,我有一些无法控制的限制(路由必须是数据流,并且工作必须由子流程完成)。

编辑 我也不能有 doStuff() 块。我希望能够创建类似于我返回的 gevent 队列并拥有工作进程的东西。现在的问题是我似乎不能同时使用 gevent.queue 和 Process。

@route('/stream')
def index():
    body = gevent.queue.Queue()
    worker = multiprocessing.Process(target=do_stuff, args=body)
    worker.start()
    return body()

def do_stuff(body):
    while True:
        gevent.sleep(5)
        body.put("data")

【问题讨论】:

    标签: python multiprocessing generator bottle gevent


    【解决方案1】:

    在您的最后一个示例中,worker.doStuff() 返回一个可迭代的生成器。您可以将其返回(将 yield 更改为 return)。 Bottle 接受迭代作为返回值,只要它们产生字节或 unicode 字符串。

    【讨论】:

    • 这是一个简化的例子。实际的应用程序将传输大量数据。如果我返回一个可迭代对象,我不必先用所有数据填充它而不是流式传输吗?也许我可以从 doStuff() 返回一个 multiprocessing.Queue 并让工作人员继续填充它。
    【解决方案2】:

    经过大量研究和试验,我确定 gevent 队列不能以这种方式与 Python 多处理一起使用。与其以这种方式做事,不如使用 redis 之类的东西来允许进程和 gevent greenlets 通信。

    @route('/stream')
    def index():
        worker = multiprocessing.Process(target=do_stuff)
        worker.start()
        yield redis_server.lpop()
    
    def do_stuff(body):
        while True:
            gevent.sleep(5)
            redis_server.lpush("data")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多