!/usr/bin/python
import os
import tornado.ioloop
import tornado.web
import tornado.gen
import subprocess
import fcntlclass MainHandler(tornado.web.RequestHandler):
""" main handler """def get(self): self.write("hello world, you requested me")
class MyHandler(tornado.web.RequestHandler):
""" my handler """@tornado.web.asynchronous def get(self): self.alldata = "" self.data = "" self.jobdone = 0 self.sub("date && echo '
' && echo 'start to sleep 5
' && \ sleep 5 && echo 'sleep again
' && sleep 5 && echo done") def done(self): ## callback is called when print "in done .... this is a callbck" print self.data self.write(self.data) self.flush() #self.finish() if self.jobdone == 1: self.finish() def sub(self, cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) pout = p.stdout self.process = p fd = pout.fileno() fl = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) ioloop = tornado.ioloop.IOLoop.instance() self.ioloop = ioloop ioloop.add_handler(fd, self.__finish_handle, ioloop.READ) def __finish_handle(self, fd, events): print "envent is .... ",events ### this callback must be added everytime the event is called ### this callback is used for next event self.ioloop.add_callback(self.done) if self.process.poll() is not None: self.ioloop.remove_handler(fd) self.data = "" while True: try: data = os.read(self.process.stdout.fileno(), 10) # when the fd is closed if len(data)==0: print "job is done done" self.jobdone = 1 break else: self.alldata += data self.data += data print "getdata " + data except: breakapp = tornado.web.Application([
(r'/', MainHandler),
(r'/my', MyHandler),
])if name == 'main':
app.listen(8080)
tornado.ioloop.IOLoop.instance().start()