2016-02-29 98 views
0

我已經將Tornado設置爲Websocket服務器,並且工作正常。Websocket內部的龍捲風協程

但是,我想在websocket上接收數據流,將其排隊,然後通過HTTP POST請求實時分塊傳輸編碼將其上傳到第二個服務器。我正在使用python請求庫來執行POST(它支持從生成器獲取塊)。

沒有協程,這不起作用 - 因爲上傳方法阻止執行,所以新的傳入數據在上傳完成之後纔會被添加到隊列中。

我在我的websocket方法中通過一些裝飾器添加了協程,但現在根本無法工作 - 沒有任何操作通過HTTP POST進行上傳。我甚至嘗試添加像這樣的make_request函數內部收益率(如「調用一個協同程序必須協同程序本身的任何功能,並使用在調用yield關鍵字」根據龍捲風文檔):

data = yield self.read_queue() 

但是拋出了一個語法錯誤。 示例代碼是here

我在Python 3.4上。

回答

1

requests庫是同步的。除了通過在線程中運行,您不應該從Tornado中使用它。在這種情況下,在線程中使用requests將比在Tornado中使用ThreadPoolExecutor更加棘手,因爲在運行時您將向其中提供數據,並且如果線程池耗盡,則可能會出現問題。

改爲使用Tornado的AsyncHTTPClientbody_producer參數允許您在進入時上傳塊。