2016-10-25 7 views
0

あるとき、私は次のコードツイストは、ブロックを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には必ずしも関連していない可能性がありますが、接続の再利用などの理由が考えられます。

ここで何が起こっているのか、誰がどのようにこの問題を解決できるかを知っていますか?

+1

Wireshark/tcpdumpのトラフィックを調べるとよいでしょう。ブラウザが待機してリクエストをキューに入れているかどうかがわかります。 –

答えて

1

偶然、誰かが竜巻セクションでrelated questionを尋ねました。あなたが疑った通り、これは"問題"ではなく、"機能"のWebブラウザです:)。 Tornado's FAQ pageには、この問題専用の小さなセクションがあります。提案されたソリューションは、任意のクエリ文字列を追加しています。その日の

引用:

一つのDEVのバグが別のDEVの文書化されていない機能です!

関連する問題