あるとき、私は次のコードツイストは、ブロックをDeferredのURIが同じ(同じブラウザから複数の呼び出し)
# -*- coding: utf-8 -*-
# 好
##########################################
import time
from twisted.internet import reactor, threads
from twisted.web.server import Site, NOT_DONE_YET
from twisted.web.resource import Resource
##########################################
class Website(Resource):
def getChild(self, name, request):
return self
def render(self, request):
if request.path == "/sleep":
duration = 3
if 'duration' in request.args:
duration = int(request.args['duration'][0])
message = 'no message'
if 'message' in request.args:
message = request.args['message'][0]
#-------------------------------------
def deferred_activity():
print 'starting to wait', message
time.sleep(duration)
request.setHeader('Content-Type', 'text/plain; charset=UTF-8')
request.write(message)
print 'finished', message
request.finish()
#-------------------------------------
def responseFailed(err, deferred):
pass; print err.getErrorMessage()
deferred.cancel()
#-------------------------------------
def deferredFailed(err, deferred):
pass; # print err.getErrorMessage()
#-------------------------------------
deferred = threads.deferToThread(deferred_activity)
deferred.addErrback(deferredFailed, deferred) # will get called indirectly by responseFailed
request.notifyFinish().addErrback(responseFailed, deferred) # to handle client disconnects
#-------------------------------------
return NOT_DONE_YET
else:
return 'nothing at', request.path
##########################################
reactor.listenTCP(321, Site(Website()))
print 'starting to serve'
reactor.run()
##########################################
# http://localhost:321/sleep?duration=3&message=test1
# http://localhost:321/sleep?duration=3&message=test2
##########################################
を持っている私の問題は、以下の通りである。
私はブラウザに2つのタブが開くと、もう1つはhttp://localhost:321/sleep?duration=3&message=test1
に、もう1つはhttp://localhost:321/sleep?duration=3&message=test2
に(メッセージは異なります)、最初のタブをリロードしてから2番目のタブを再ロードしてから、ほぼ同時に終了します。 F5を押すと約3秒後に最初のタブが表示され、2番目のタブは最初のタブの約0.5秒後に終了します。
これは、各リクエストがスレッドに遅延され、それらが並行してスリープしているので、これは予想されます。
ただし、2番目のタブのURLが最初のタブのURLと同じになるように変更した場合、つまりhttp://localhost:321/sleep?duration=3&message=test1
に変更すると、すべてがブロックされます。最初のタブでF5キーを押し、2番目のタブでできるだけ早くF5キーを押すと、2番目のタブは最初のタブから3秒後に終了します。彼らは並行して実行されません。
URIの両方が両方のタブで同じである限り、このサーバーはブロックを開始します。これはFirefoxでもChromeでも同じです。しかし、私がChromeで起動し、Firefoxでもう一度起動すると、再びブロックされません。
したがって、Twistedには必ずしも関連していない可能性がありますが、接続の再利用などの理由が考えられます。
ここで何が起こっているのか、誰がどのようにこの問題を解決できるかを知っていますか?
Wireshark/tcpdumpのトラフィックを調べるとよいでしょう。ブラウザが待機してリクエストをキューに入れているかどうかがわかります。 –