1

インスタンスの 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/1localhost:8888/2、期待される出力が生成されます。

これは正常ですか?これは意図した動作ですか?

私の悪い英語でごめんなさい。

4

2 に答える 2

1

私のためにも働きます:

$ curl http://127.0.0.1:8888/1 &
[1] 95055
$ curl http://127.0.0.1:8888/1 &
[2] 95056
$ curl http://127.0.0.1:8888/1 &
[3] 95057

竜巻プログラムの出力:

bash-3.2$ python3 test.py 
##
##
Setting up executor ...
Yielding ...
Setting up executor ...
Yielding ...
Setting up executor ...
Yielding ...
##
##
##
Finished!
Finished!
Finished!
##
##
##
于 2015-02-28T23:53:44.207 に答える