Skip to content

Instantly share code, notes, and snippets.

@ninehills
Forked from methane/gist:2185380
Last active December 10, 2015 17:08
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save ninehills/4465999 to your computer and use it in GitHub Desktop.
Save ninehills/4465999 to your computer and use it in GitHub Desktop.
tornado add block task to ThreadPool
from time import sleep
import tornado
from multiprocessing.pool import ThreadPool
_workers = ThreadPool(10)
class BackgroundMix(tornado.web.RequestHandler):
"""将block任务放入线程池中执行
EXAMPLE:
# blocking task like querying to MySQL
def blocking_task(n):
sleep(n)
return n
class Handler(RequestHandler, BackgroundMix):
@asynchronous
def get(self):
self.run_background(blocking_task, self.on_complete, (10,))
def on_complete(self, res):
self.write("Test {0}<br/>".format(res))
self.finish()
"""
def run_background(self, func, callback, args=(), kwds={}):
self.ioloop = tornado.ioloop.IOLoop.instance()
def _callback(result):
self.ioloop.add_callback(lambda: callback(result))
_workers.apply_async(func, args, kwds, _callback)
@ninehills
Copy link
Author

这个有两个地方不好用

  1. 无法处理任务抛出的异常

  2. 原来的任务比如是blocking_task(10),这里run_background的最后一个参数却不一样,具体是这样的

    t(10) ---> run_background(t, self.on_t, (10,))
    t(10,20) ---> run_background(t, self.on_t, (10,20))
    t(10,a=20) --> run_background(t, self.on_t, (10,), {'a':20})
    

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment