时间:2021-07-01 10:21:17 帮助过:11人阅读
Python代码
import gevent from gevent import monkey monkey.patch_all() def download(): import urllib2 urllib2.urlopen('http://www.google.com/').read() c = gevent.spawn(download) gevent.joinall([c])
gevent通过spawn创建并启动一个greenlet,此greenlet执行函数为download.启动这个greenlet是通过把这个greenlet加入到libev的prepare callback里面.libev在每次执行事件循环的时候都会调用prepare callback里面的函数,执行后把里面的callback清除掉.这样就能保证每次spawn的greenlet有执行的机会.并且只会执行一次.
在这个greenlet执行urlopen以及read的时候,因为涉及到io操作(socket.[send|recv]),gevent通过monkey patch把这些函数进行了封装,当调用相关的操作时就会创建一个对应fd的watcher加入到libev的事件列表里面.
当有相关的读写事件发生时,会触发相应的callback.相关的callback会调用greenlet的switch进行coroutine的切换.
通过上面的方式greenlet达到了调度器的目的.