Tornado-non-blocking-process

!/usr/bin/python

import os
import tornado.ioloop
import tornado.web
import tornado.gen
import subprocess
import fcntl

class 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: break

app = tornado.web.Application([
(r'/', MainHandler),
(r'/my', MyHandler),
])

if name == 'main':
app.listen(8080)
tornado.ioloop.IOLoop.instance().start()

你可能感兴趣的:(Tornado-non-blocking-process)