3

Twisted を使用して Web サーバーを作成しています。このサーバーが実行するタスクの 1 つに時間がかかります (~5 分)。このタスクが完了したことをクライアントに効率的に通知できるようにしたいと考えています。

コメット/ロングポーリングの使用を検討しましたが、私の人生では、ブラウザがデータを受信したときにデータをレンダリングできません。

このメカニズムのプロトタイプを作成するために、次のように記述しました。

時計.py

from twisted.internet import reactor, task
from twisted.web.static import File
from twisted.web.server import Site
from twisted.web import server
from twisted.web.resource import Resource
import time

class Clock(Resource):
    def __init__(self):
        self.presence=[]
        loopingCall = task.LoopingCall(self.__print_time)
        loopingCall.start(1, False)
        Resource.__init__(self)

    def render_GET(self, request):
        print "request from",request.getClientIP()
        request.write(time.ctime())
        self.presence.append(request)
        return server.NOT_DONE_YET

    def __print_time(self):
        print "tick"
        for p in self.presence:
            print "pushing data to",p.getClientIP()
            p.write(time.ctime())

root = Resource()
clock = ClockPage()
index = File("index.html")
root.putChild("index.html",index)
root.putChild("clock",clock)
factory = Site(root)
reactor.listenTCP(8080, factory)
reactor.run()

index.html

<html>
<head>
</head>
<body>
<div id="data">Hello</div>
<script type="text/javascript">
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
  if(xhttp.readyState == 4 && xhttp.status == 200){
    alert(xhttp.responseText);
    document.getElementById("data").innerHTML=xhttp.responseText;
  }
};
xhttp.open("GET","clock",true);
xhttp.send(null);
</script>
</body>
</html>

私がサーバー側で行ってきたことはrequest.write、毎秒時間で呼び出しています。

クライアント側では、XMLHTTPRequest を適切なリソースに開き、いつでも div に直接ダンプするだけresponseTextです。.readyState == 4.status == 200

問題は、div が上書きされず、アラートが呼び出されないことです。

の使用について読み続けmultipart/x-mixed-replaceていますが、使用方法がよくわかりません。この種のものをツイストで実装するためのチュートリアルまたはドキュメントへのポインターは大歓迎です。

4

2 に答える 2

0

p.finish()リクエストが実際に完了するように、ループにを追加することを検討してください。現在の実装は永久にハングします。

于 2011-05-07T04:16:17.467 に答える
0

代わりに「HTTP ストリーミング」を使用するのはどうですか? サーバーから「リスニング」ブラウザーにログを「ストリーミング」するためにそれを正常に使用しました。以下は、ツイストと少しの js を使用した簡単な実装です: http://codelab.ferrarihaines.com/archives/161

于 2012-08-29T16:19:08.720 に答える