python,tornado,搭建了一個簡單的web介面服務
但是發現,介面之間相互阻塞,一個介面被訪問,只有結束后,其他介面的訪問才能進來
于是按照網上的講解,加入了
@tornado.web.asynchronous
@tornado.gen.coroutine
使用yield 執行 @run_on_executor的方法
每個介面都這樣做后,介面之間不再相互阻塞
但是問題是,即使使用了異步修飾符,對于同一個介面,多個訪問時,還是會同步執行,無法并發。
比如A介面已經實作上面的異步修飾,A里面sleep 10秒,連續兩次訪問,第二次只有等第一次結束時(10秒后),才會進入。
搜了好久也沒有找到原因,請各位幫忙解答
application = tornado.web.Application([
(r"/test1", test1_handler.test1),
(r"/test2", test2_handler.test2),
])
if __name__ == "__main__":
application.listen(8291)
tornado.ioloop.IOLoop.instance().start()
import logging
import time
from concurrent.futures import ThreadPoolExecutor
import tornado
import tornado.web
import tornado.gen
from tornado.concurrent import run_on_executor
from common.executor_handler import ExecutorInstance
class test2(tornado.web.RequestHandler):
# executor = ExecutorInstance()
executor = ThreadPoolExecutor(4)
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
yield self.wait(5)
@run_on_executor
def wait(self,s):
tag = time.time()
logging.info("test2 開始 %s" % tag)
time.sleep(s)
self.write("success")
logging.info("test2 結束 %s" % tag)
self.finish()
如上,連續兩次執行介面歐test2時,結果如下:
2019-09-24 16:07:15,013 - root - INFO - test2 開始 1569312435.013742
2019-09-24 16:07:20,019 - root - INFO - test2 結束 1569312435.013742
2019-09-24 16:07:20,021 - tornado.access - INFO - 304 GET /test2 (127.0.0.1) 5017.06ms
2019-09-24 16:07:20,025 - root - INFO - test2 開始 1569312440.024935
2019-09-24 16:07:25,027 - root - INFO - test2 結束 1569312440.024935
2019-09-24 16:07:25,028 - tornado.access - INFO - 304 GET /test2 (127.0.0.1) 5004.62ms
可以看到第二次執行等待第一次結束才開始,請問是為什么,怎么解決,否則沒有任何并發可言啊
uj5u.com熱心網友回復:
有人知道嗎,給個搜索方向也行啊uj5u.com熱心網友回復:
111111uj5u.com熱心網友回復:
333333uj5u.com熱心網友回復:
必須用兩個瀏覽器(或者兩臺機器)打開請求,才能看出來并發,在一個瀏覽器中打開,兩個tab也都不行uj5u.com熱心網友回復:
from tornado.concurrent import run_on_executorfrom concurrent.futures import ThreadPoolExecutor
import tornado
from tornado import gen
import tornado.web
import time
class TestHandler(tornado.web.RequestHandler):
executor = ThreadPoolExecutor(2)
@gen.coroutine
def get(self):
result = yield self.doingRunTask()
self.write(result)
@run_on_executor
def doingRunTask(self):
print('start')
time.sleep(5)
print('end')
return 'ddddddddddd'
application = tornado.web.Application([
(r"/test", TestHandler),
])
if __name__ == "__main__":
application.listen(8000)
tornado.ioloop.IOLoop.instance().start()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238189.html
