tornado推薦是多程序+協程的方式執行,ioloop.current().start(),單個介面阻塞,會導致整個服務阻塞,所以一般介面邏輯中要使用非阻塞的方法。
比如time.sleep(5)應該更換為yield gen.sleep(5),這樣就可以將資源讓給其他介面處理,該介面仍然會阻塞,等同於time.sleep(5)
tornado介面阻塞導致主線程阻塞,將啟動程序設為與cpu核數相同,將呼叫方法改為非同步,改為非同步有兩個解決方案:
1、介面中呼叫的方法函式要是非同步非阻塞的,配合非同步庫使用,比如
2、tornado提供excutor,可以將同步函式變為future物件
classtesthandler(basehandler):
__class_name =sys._getframe().f_code.co_name
def super(activemqlistenerhandler, self).
self.conf = options.conf.api.get(self.__class_name
) self.executor = threadpoolexecutor(self.conf.max_thread) #
用執行時的最大執行緒數,用於將同步方法變為返回future
@gen.coroutine
defpost(self):
print(444444)
s = yield
self.handletest()
print(555555)
#run_on_executor會將下方方法變為future
@run_on_executor
def handletest(self, *args):
time.sleep(60)
什麼導致執行緒阻塞?
導致執行緒阻塞的原因主要有以下幾方面。1 執行緒進行了休眠 執行緒執行了thread.sleep int n 方法,執行緒放棄cpu,睡眠n毫秒,然後恢復執行。2 執行緒要執行一段同步 由於無法獲得相關的同步鎖,只好進入阻塞狀態,等到獲得了同步鎖,才能恢復執行。3 執行緒執行wait 進入阻塞狀態 ...
tornado非同步非阻塞程式設計教程詳細
第1節 tornado框架的優勢詳細講解 第2節 tornado是如何實現做到高併發的原理 tornado非同步程式設計詳解 第3節 tornado容易產生的幾個誤解 第4節 tornado中async和await及coroutine裝飾器的介紹 第5節 通過socket的阻塞和非阻塞演示來解說 t...
IOS usleep函式導致執行緒阻塞
今天除錯ios程式,由於程式裡面使用了稍微的延時,就隨手寫了usleep函式,使用了幾個月沒啥問題,結果今天竟然阻塞了整個執行緒,讓程式出不來了,經查證原來usleep函式有那麼多問題,特記錄!哈哈 usleep 有有很大的問題 1.在一些平台下不是執行緒安全,如hp ux以及linux 2.usl...