インスタンスの 1 つで が終了するRequestHandler
のを待っている間に、単一の Tornado クラスが新しいリクエストに参加できますか?Future
a を呼び出す Tornado コルーチンをデバッグしていたThreadPoolExecutor
ところ、コルーチンがエグゼキュータの終了を待っている間に、RequestHandler
がブロックされていることに気付きました。したがって、コルーチンが終了するのを待っているこのハンドラへの新しいリクエスト。
私の観察を再現するために書いたコードは次のとおりです。
from time import sleep
from concurrent.futures import ThreadPoolExecutor
from tornado.ioloop import IOLoop, PeriodicCallback
from tornado.web import Application, RequestHandler
from tornado.gen import coroutine
class Handler1(RequestHandler):
@coroutine
def get(self):
print('Setting up executor ...')
thread_pool = ThreadPoolExecutor(1)
print('Yielding ...')
yield thread_pool.submit(sleep, 30)
self.write('Ready!')
print('Finished!')
app = Application([('/1$', Handler1)])
app.listen(8888)
PeriodicCallback(lambda: print('##'), 10000).start()
IOLoop.instance().start()
ここで、2 回アクセスするlocalhost:8888/1
と、次の出力が得られます。
##
Setting up executor ...
Yielding ...
##
##
##
Finished!
Setting up executor ...
Yielding ...
##
##
##
Finished!
##
しかし、私は次のことが起こると予想しています:
##
Setting up executor ...
Yielding ...
Setting up executor ...
Yielding ...
##
##
##
Finished!
Finished!
##
まだ10 秒ごとにRequestHandler
を取得しているため、 のみがブロックされているように見えることに注意してください。##
実際、別の同一のRequestHandler
(Handler2) を追加して および にアクセスするlocalhost:8888/1
とlocalhost:8888/2
、期待される出力が生成されます。
これは正常ですか?これは意図した動作ですか?
私の悪い英語でごめんなさい。