tornado中ioloop-yield-future与thread的配合

在写项目 torweb, 需要有一个分离一个线程去完成耗时操作.

把 tornado 的 Future、Python 里的 Yield 和线程结合起来,处理阻塞函数。可以查看 tests/test_thread_future.py ,具体分析可以查看 http://jmpews.github.io/posts/tornado-future-ioloop-yield.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from threading import Thread
class ThreadWorker(Thread):
'''
线程Future
'''
def __init__(self, future, func, *args, **kwargs):
Thread.__init__(self)
self.future =future
self.func =func
self.args = args
self.kwargs = kwargs
print('worker init...')
def run(self):
result = self.func(*self.args, **self.kwargs)
self.future.set_result(result)
def run_with_thread_future(*args, **kwargs):
'''
如何利用yield, future和线程的配合
http://jmpews.github.io/posts/tornado-future-ioloop-yield.html
:param args:
:param kwargs:
:return:
'''
def wraps_func(func):
@functools.wraps(func)
def wraps_args(*args, **kwargs):
future = Future()
work = ThreadWorker(future, func, *args, **kwargs)
work.start()
return future
return wraps_args
return wraps_func