gpt4 book ai didi

python - 使用 Python Bottle、Multiprocessing 和 gevent 的流式连接

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:03 24 4
gpt4 key购买 nike

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

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

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

@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'

这是一个大型项目,我做事的方式没有太多灵 active 。我知道有时最简单的答案是“你的设计是错误的”。但在这种情况下,我有一些超出我控制范围的约束(路由必须是数据流,工作必须由子流程完成)。

编辑我也不能有 doStuff() block 。我希望能够创建类似 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")

最佳答案

经过大量研究和试验,我确定 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")

关于python - 使用 Python Bottle、Multiprocessing 和 gevent 的流式连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com