流连接使用Python瓶,多处理和GEVENT(Streaming Connection Using

2019-07-03 17:32发布

我有一个使用的子进程来完成大部分的工作,为请求瓶的应用。 对于返回单个响应的路线,我这样做有什么下文。

@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和,一起处理。

@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")

Answer 1:

在您的最后一个例子, worker.doStuff()返回一个生成器,这是迭代。 你可以返回(改变yield ,以return )。 瓶接受iterables作为返回值,只要ES它们产生字节或unicode字符串。



Answer 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")


文章来源: Streaming Connection Using Python Bottle, Multiprocessing, and gevent