Tornado-non-blocking-process
2013-12-29 本文已影响0人
单行道
<pre>
!/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 '<br/>' && echo 'start to sleep 5<br/>' && \
sleep 5 && echo 'sleep again<br/>' && 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()
</pre>