Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Tornado和Prototype的异步COMET查询_Python_Ajax_Comet_Long Polling_Tornado - Fatal编程技术网

Python 使用Tornado和Prototype的异步COMET查询

Python 使用Tornado和Prototype的异步COMET查询,python,ajax,comet,long-polling,tornado,Python,Ajax,Comet,Long Polling,Tornado,我正在尝试使用Tornado和JS原型库编写简单的web应用程序。因此,客户端可以在服务器上执行长时间运行的作业。我希望这个作业能够异步运行,这样其他客户端就可以查看页面并在那个里做一些事情 这是我得到的: #!/usr/bin/env/ pytthon import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.options import def

我正在尝试使用Tornado和JS原型库编写简单的web应用程序。因此,客户端可以在服务器上执行长时间运行的作业。我希望这个作业能够异步运行,这样其他客户端就可以查看页面并在那个里做一些事情

这是我得到的:

#!/usr/bin/env/ pytthon

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()
#/usr/bin/env/pytthon
导入tornado.httpserver
导入tornado.ioloop
导入tornado.options
导入tornado.web
从tornado.options导入,定义选项
导入操作系统
导入字符串
从时间上导入睡眠
从日期时间导入日期时间
定义(“端口”,默认为8888,help=“在给定端口上运行”,type=int)
类MainHandler(tornado.web.RequestHandler):
def get(自我):
render(“templates/index.html”,title=“::Log watcher::”,c_time=datetime.now()
类LongHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(自我):
self.wait\u for\u smth(callback=self.async\u callback(self.on\u finish))
打印(“从异步退出”)
返回
def wait_for_smth(自我,回调):
t=0
而(t<10):
打印“睡眠2秒,t={0}”。格式(t)
睡眠(2)
t+=1
回调函数()
def on_完成(自):
印刷(“内表面”)
self.write(“长时间运行的作业完成”)
self.finish()
def main():
tornado.options.parse_命令行()
设置={
“static_path”:os.path.join(os.path.dirname(_文件__),“static”),
}
application=tornado.web.application([
(r“/”,主处理器),
(r“/longPolling”,LongHandler)
],**设置
)
http_server=tornado.httpserver.httpserver(应用程序)
http_server.listen(options.port)
tornado.ioloop.ioloop.instance().start()
如果名称=“\uuuuu main\uuuuuuuu”:
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>

{{title}}
偏移量=0
上次读取=0
功能测试(){
新的Ajax.Request(“http://172.22.22.22:8888/longPolling",
{
方法:“获取”,
是的,
onSuccess:功能(传输){
警报(transport.responseText);
}
})
}
当前时间为{c_time}

我做错了什么?如何使用Tornado和Prototype(或jQuery)实现长池

PS:我看过聊天示例,但它太复杂了。无法理解它是如何工作的:(


PSS下载完整版

Tornado是单线程web服务器。您在
wait\u for\u smith
方法中的while循环正在阻止Tornado

您可以像这样重写该方法:

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()

您需要在顶部添加
导入时间
,以实现此功能。

我已将Tornado的聊天示例转换为运行。查看和

它使用轻量级用户级线程(),在速度/内存使用方面与Tornado相当。但是,代码很简单,可以调用sleep()和urlopen()在您的处理程序中,无需阻塞整个进程,您就可以生成执行相同操作的长时间运行的作业

你可以看报纸

应该是

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

我读过一本叫Ted Roden的书,这本书非常有帮助。我用Tornado(python)创建了一个复杂的实时聊天系统。我建议您和John Goerzen一样阅读这本书。

我已经尝试过这种方法,可以确认它不再挂起,但现在程序显示一个警报框,其中未定义responseText,并且出现405错误。说得太快,问题出在我这边……我指定了两个不同的地址。这肯定有效。但我有这么长的轮询时间吗?对我来说,它看起来就像是轮询。请注意,我自己也是Tornado/Comet的新手。如果是非默认端口,则应传递整个路径。
function test(){
            new Ajax.Request("/longPolling",
            {
                method:"get",
                asynchronous:true,
                onSuccess: function (transport){
                    alert(transport.responseText);
                }
            })
        }