假設我有一個長期運行的功能:Python的龍捲風 - 困惑如何阻塞函數轉換成一個無阻塞功能
def long_running_function():
result_future = Future()
result = 0
for i in xrange(500000):
result += i
result_future.set_result(result)
return result_future
我有一個處理一個get函數與上述結果打印用戶for循環,增加了在所有的xrange數量:
@gen.coroutine
def get(self):
print "start"
self.future = long_running_function()
message = yield self.future
self.write(str(message))
print "end"
如果我同時運行兩個網絡瀏覽器上面的代碼中,我得到:
開始
末
開始
末
這似乎是阻止。從我的理解中,@gen.coroutine
和yield
語句不阻止IOLoop在get函數,但是,如果這是阻斷協程內的任何功能,那麼它會阻止IOLoop。
因此,我做的另一件事是將long_running_function
變成一個回調,並使用yield gen.Task
來代替。
@gen.coroutine
def get(self):
print "start"
self.future = self.long_running_function
message = yield gen.Task(self.future, None)
self.write(str(message))
print "end"
def long_running_function(self, arguments, callback):
result = 0
for i in xrange(50000000):
result += i
return callback(result)
這不切得,它給了我:
開始
末
開始
末
我可以使用線程來執行那些平行,但它似乎並沒有要走的路,因爲我可能會開了很多THRE廣告,並根據龍捲風的用戶指南,它可能是昂貴的。
人們如何寫龍捲風異步庫?
我認爲你是對的,但是[Calling-blocking-functions](htt p://www.tornadoweb.org/en/stable/guide/coroutines.html#calling-blocking-functions)沒有提到CPU綁定或事件驅動,它只是說:「最簡單的方法來調用來自協同程序的阻塞函數是使用ThreadPoolExecutor,它返回與協程兼容的Futures「 –