tornado介面阻塞導致主線程阻塞

2022-09-19 14:33:13 字數 1013 閱讀 5916

tornado推薦是多程序+協程的方式執行,ioloop.current().start(),單個介面阻塞,會導致整個服務阻塞,所以一般介面邏輯中要使用非阻塞的方法。

比如time.sleep(5)應該更換為yield gen.sleep(5),這樣就可以將資源讓給其他介面處理,該介面仍然會阻塞,等同於time.sleep(5)

tornado介面阻塞導致主線程阻塞,將啟動程序設為與cpu核數相同,將呼叫方法改為非同步,改為非同步有兩個解決方案:

1、介面中呼叫的方法函式要是非同步非阻塞的,配合非同步庫使用,比如

2、tornado提供excutor,可以將同步函式變為future物件

class

testhandler(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...