Asynchronous COMET query with Tornado and Prototype Asynchronous COMET query with Tornado and Prototype ajax ajax

Asynchronous COMET query with Tornado and Prototype


Tornado is single-threaded web server. Your while loop in wait_for_smith method is blocking Tornado.

You can rewrite that method like this:

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

You need to add import time at the top to make this work.


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

should be

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


I've converted Tornado's chat example to run on gevent. Take a look at the live demo here and the explanation and source code here.

It uses lightweight user-level threads (greenlets) and is comparable in speed/memory use with Tornado. However, the code is straightforward, you can call sleep() and urlopen() in your handlers without blocking the whole process and you can spawn long running jobs that do the same. Under the hood the application is asynchronous, powered by an event loop written in C (libevent).

You can read the introduction here.