看了一些tornado異步的實現,我發現,人們在使用異步非阻塞特性的時候都是使用的線程的能提供異步的package,比如tornado.httpclient.HTTPClient(),但是我要怎樣才能將自己的一個耗時函數(比如下面的sleep)變成異步非阻塞呢,代碼如下class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self):
tornado.ioloop.IOLoop.instance().add_callback(self.sleep)
self.finish('OK')
def sleep(self):
for i in range(100000000):
if i % 100000 == 0:
print(i)
print('ooo')當用該handler處理請求時,能立即返回'OK'表示異步能實現,但是在處理sleep的時候卻不能處理其他的請求,其他請求會被阻塞知道之前這個請求處理完畢。請問各位大牛有什么方法將自己寫的耗時函數變成異步非阻塞呢(不使用線程池,既然異步是tornado的特性,應該是有方法的撒)?這和tornado的單線程循環有關嗎?理解錯了異步、阻塞和并發,tornado確實能做到異步和非阻塞,但是單線程怎樣做到并發呢,當第一個請求過來tornado返回過后,后臺還在處理耗時任務,此時如果有其他請求過來,其他請求會處于一直等待的狀態,這不是表明無法并行嗎?
添加回答
舉報
0/150
提交
取消