9

Tornado と JS Prototype ライブラリを使用して単純な Web アプリケーションを作成しようとしています。したがって、クライアントはサーバー上で長時間実行されるジョブを実行できます。このジョブが非同期で実行されることを望みます。これにより、他のクライアントがページを表示してそこで何かを実行できるようになります。

これが私が持っているものです:

#!/usr/bin/env/ python

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options

import os
import string
from time import sleep
from datetime import datetime

define("port", default=8888, help="run on the given port", type=int)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("templates/index.html", title="::Log watcher::", c_time=datetime.now())

class LongHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.wait_for_smth(callback=self.async_callback(self.on_finish))
        print("Exiting from async.")
        return

    def wait_for_smth(self, callback):
        t=0
        while (t < 10):
            print "Sleeping 2 second, t={0}".format(t)
            sleep(2)
            t += 1
        callback()

    def on_finish(self):
        print ("inside finish")
        self.write("Long running job complete")
        self.finish()



def main():
    tornado.options.parse_command_line()

    settings = {
        "static_path": os.path.join(os.path.dirname(__file__), "static"),
        }

    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/longPolling", LongHandler)
        ], **settings
    )
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()


if __name__ == "__main__":
    main()

サーバー部分です。メインビューがあります(小さな挨拶、現在のサーバー時間、および実行時間の長いジョブを実行する ajax クエリの URL が表示されます。ボタンを押すと、実行時間の長いジョブが実行されます。サーバーがハングします :(このジョブは実行中です。テンプレート ページは次のとおりです。

<html>
<head>
    <title>{{ title }}</title>

    <script type="text/javascript" language="JavaScript" src="{{ static_url("js/prototype.js")}}"></script>


    <script type='text/javascript' language='JavaScript'>
        offset=0
        last_read=0

        function test(){
            new Ajax.Request("http://172.22.22.22:8888/longPolling",
            {
                method:"get",
                asynchronous:true,
                onSuccess: function (transport){
                    alert(transport.responseText);
                }
            })
        }

        
    </script>
</head>
<body>
    Current time is {{c_time}}
    <br>
    <input type="button" value="Test" onclick="test();"/>
</body>
</html>

私は何を間違っていますか?Tornado と Prototype (または jQuery) を使用してロング プーリングを実装する方法

PS: チャットの例を見てきましたが、複雑すぎます。それがどのように機能するのか理解できません:(

PSS の完全な例をダウンロード

4

4 に答える 4

15

Tornado はシングルスレッドの Web サーバーです。メソッドの while ループがwait_for_smithトルネードをブロックしています。

このメソッドを次のように書き換えることができます。

def wait_for_smth(self, callback, t=10):
    if t:
        print "Sleeping 2 second, t=%s" % t
        tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 2, lambda: self.wait_for_smth(callback, t-1))
    else:
        callback()

import timeこれを機能させるには、上部に追加する必要があります。

于 2010-03-12T05:05:43.863 に答える
1
function test(){
            new Ajax.Request("http://172.22.22.22:8888/longPolling",
            {
                method:"get",
                asynchronous:true,
                onSuccess: function (transport){
                    alert(transport.responseText);
                }
            })
        }

する必要があります

function test(){
            new Ajax.Request("/longPolling",
            {
                method:"get",
                asynchronous:true,
                onSuccess: function (transport){
                    alert(transport.responseText);
                }
            })
        }
于 2011-06-26T13:34:29.303 に答える
0

Tornado のチャット サンプルをgeventで実行するように変換しました。こちらのライブ デモと、こちらの説明とソース コードをご覧ください

軽量のユーザー レベル スレッド ( greenlets ) を使用し、Tornado と同等の速度/メモリ使用量を使用します。ただし、コードは簡単です。プロセス全体をブロックすることなく、ハンドラで sleep() と urlopen() を呼び出すことができ、同じことを行う長時間実行されるジョブを生成できます。内部では、アプリケーションは非同期であり、C で記述されたイベント ループ ( libevent ) によって強化されています。

ここで紹介を読むことができます。

于 2010-08-03T16:26:28.540 に答える
0

Ted Roden 著の「Building the Realtime User Experience」という本を読みましたが、とても役に立ちました。Tornado (python) を使用して、複雑なリアルタイム チャット システムを作成することができました。この本と、John Goerzen による「Foundations of Python Network Programming」を読むことをお勧めします。

于 2012-02-25T13:50:44.887 に答える