[关闭]
@dantangfan 2015-01-21T17:26:38.000000Z 字数 1883 阅读 1698

tornado学习

1. 简单理解协程

什么是协程
本质上什么是协程?举个例子:就是类似goto一样,可以在多个fun之间来回跳转。比如A函数执行到一半然后switch到B函数执行...诸如此类。 那如果只考虑一个函数呢?那对于A函数而言:其实就是其可以执行到一半先停下,干点别的事情后再接着往下运行。看到这里你是不是想到了debug时的打断点?执行到断点的时候就停下,只有next往下setp时候这个函数才接着往下执行,对不对? 那如果我们可以实现类似的断点机制,是不是就可以实现多个函数来回跳转呢?A函数执行到断点时就停下,系统去B执行,等B执行完毕了才回来接着step往断点后边的代码航执行~

协程其实就是这么个东西,那么在Python中什么可以实现debug断点功能呢?当然是yield了。执行到中间的yield系统就停下返回了,之后在调用next时才回接着往下执行。 你看,是不是通过这个东西就可以做到多个函数之间来回跳转?

那什么时候跳转呢?之前是yield才会,那我是不是可以将之封装一下呢?封装成:一个协程,然后sleep就yield出来,接下来就做到协程的功能来。

本质上就是这么回事~别听别人说的多悬乎~只是在这个基础模型上又加了很多manager的功能等等~


2. Future到底是什么玩意儿

如代码

  1. from tornado.concurrent import Future
  2. def async_fetch_future(url):
  3. http_client = AsyncHTTPClient()
  4. my_future = Future()
  5. fetch_future = http_client.fetch(url)
  6. fetch_future.add_done_callback(
  7. lambda f: my_future.set_result(f.result()))
  8. return my_future

没有并行经验的童鞋肯定是想不通Future到底是用来干嘛的,所以首先我们要知道python多线程坑爹的GIL。

对于python来说,作为解释型语言,Python的解释器必须做到既安全又高效。我们都知道多线程编程会遇到的问题,解释器要留意的是避免在不同的线程操作内部共享的数据,同时它还要保证在管理用户线程时保证总是有最大化的计算资源。而python是通过使用全局解释器锁来保护数据的安全性:
python代码的执行由python虚拟机来控制,即Python先把代码(.py文件)编译成字节码(字节码在Python虚拟机程序里对应的是PyCodeObject对象,.pyc文件是字节码在磁盘上的表现形式),交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行。python在设计的时候在虚拟机中,同时只能有一个线程执行。同样地,虽然python解释器中可以运行多个线程,但在任意时刻,只有一个线程在解释器中运行。而对python虚拟机的访问由全局解释器锁来控制,正是这个锁能保证同一时刻只有一个线程在运行。在多线程的环境中,python虚拟机按一下方式执行:
1. 设置GIL(global interpreter lock).
2. 切换到一个线程执行。
3. 运行:
a. 指定数量的字节码指令。
b. 线程主动让出控制(可以调用time.sleep(0))。
4. 把线程设置为睡眠状态。
5. 解锁GIL.
6. 再次重复以上步骤。
GIL的特性,也就导致了python不能充分利用多核cpu。而对面向I/O的(会调用内建操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行。如果线程并为使用很多I/O操作,它会在自己的时间片一直占用处理器和GIL。这也就是所说的:I/O密集型python程序比计算密集型的程序更能充分利用多线程的好处。
总之,不要使用python多线程,使用python多进程进行并发编程,就不会有GIL这种问题存在,并且也能充分利用多核cpu。

言归正传,Future到底是个什么玩意儿呢?其实这个玩意儿就跟python3中的concurrent.futures相似,那后者又是个什么玩意儿呢?简单来说,它就是一个实现异步调用的接口。所以上面代码,在my_future = Future()return my_future之间的就是我们需要异步处理的代码,而返回my_future就告诉了系统我们这个程序还没搞定,需要挂起玩儿一会儿。我也解释不清楚,后面tornado.gen就是把这个过程用装饰器封装起来了而已,依样画葫芦就行了。

草,妈的,说不清楚了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注