tornado一步一步来(三)

# -.- coding:utf-8 -.-
# __author__ = 'zhengtong'
# tornado io_loop是单线程任务,
# 当任何堵塞代码加入到该线程中都会导致整体堵塞.
# 所以必须要谨慎对待ioloop.
import time
import tornado.concurrent
from tornado import gen, ioloop
import multiprocessing as mp


def fibonacci(n):
    # print mp.current_process().name
    if n <= 1:
         return 1
    else:
         return fibonacci(n-1) + fibonacci(n-2)


@gen.coroutine
def proxy(pool):
    s = pool.submit(fibonacci, 34)
    raise gen.Return(s)


@gen.coroutine
def main():

    pool = tornado.concurrent.futures.ProcessPoolExecutor()
    
    """
    这里移除了原来的callback代码, 如果必须要打印退出状态
    那就到proxy函数中去输出出来即可.
    
    采用coroutine的好处是代码连续起来了,不用拆来拆去.
    """

    for i in range(100):
        s = yield proxy(pool)
        # 这里千万不能采用这种写法, result()就是一个等待结果的方法.
        # 只要在这里开启这行代码, 整体瓶颈就在这里等着了,one by one!
        # print s.result()

    # 这里将会第一个输出到屏幕中, 也就是说, 上面的代码已经执行并且仍在计算中, 但是不会堵塞.
    print 'hello world'


if __name__ == '__main__':
    io_loop = ioloop.IOLoop.current()
    io_loop.run_sync(main)

 

你可能感兴趣的:(tornado一步一步来(三))