websocket里面的龙卷风协同程序

时间:2016-02-29 06:46:06

标签: python python-requests tornado

我已经将Tornado设置为Websocket服务器,并且工作正常。

但是,我想在websocket上获取传入的数据流,将其排队,然后通过HTTP POST请求将其上传到第二台服务器,并实时进行分块传输编码。我使用python请求库来执行POST(它支持从生成器获取块)。

如果没有协同程序,这不起作用 - 因为上传方法会阻止执行,因此新的传入数据在上传完成之前不会被添加到队列中。

我在我的websocket方法中通过一些装饰器添加了协同程序,但它现在根本不起作用 - 没有任何内容通过HTTP POST上传。我甚至尝试在make_request函数中添加一个yield就像那样("任何调用协程的函数都必须是一个协程本身,并在调用中使用yield关键字"根据Tornado文档):

data = yield self.read_queue()

但是引发了语法错误。 示例代码为here

我在使用Python 3.4。

1 个答案:

答案 0 :(得分:1)

requests库是同步的。你不应该在Tornado中使用它,除非在线程中运行它。在这种情况下在线程中使用requests比在Tornado中使用ThreadPoolExecutor更棘手,因为在运行时你会将数据输入到它中,如果线程池耗尽,你可能会遇到问题

相反,请使用Tornado' AsyncHTTPClientbody_producer参数允许您在进入时上传块。