当你有一些阻塞的任务,不玩异步事件循环不错,你必须把它放在一个单独的线程。
如果您打算有无限数量的阻塞任务,您希望使用线程池。
无论采用哪种方式,您都希望有一个封装异步任务,阻止来自线程化任务的通知。
要做到这一点,最简单的方法是使用像tornado-threadpool预建图书馆*然后,你就做这样的事情:
class LongHandler(tornado.web.RequestHandler):
@thread_pool.in_thread_pool
def long_time_function(self, callback):
time.sleep(5)
callback("foo")
如果你想自己做,this gist展示了一个例子你必须做什么 - 或者当然,各种Tornado线程池库的源代码可以作为示例代码。只要记住Python GIL的局限性:如果你的后台任务是CPU绑定的(并且在Python中执行大部分工作,而不是像释放GIL那样的C扩展),你必须把它放在一个单独的过程中。龙卷风进程池库中快速搜索不转了许多不错的选择,但适应线程池代码来处理池的代码通常是在Python非常容易。**
*请注意,我不是特别推荐该图书馆;这只是Google搜索中出现的第一件事情,并且快速浏览它看起来可用且正确。
**它通常很简单,只要用concurrent.futures.ProcessPoolExecutor
或multiprocessing.dummy.Pool
替换就可以用multiprocessing.Pool
替换。唯一的技巧是确保所有的任务参数和返回值都很小并且可以选择。
谢谢,我看到另一个类似的策略问题/答案,但在这种情况下,我无法控制功能如何工作;我只是叫它。 –