协程:当一个线程执行某一任务时,若产生IO延迟,跳转去执行另外一个任务。

  一、greenlet  

from greenlet import greenlet
g = greenlet()
g.switch() # 手动实现协程

  实现协程的基本功能模块是greenlet,通过switch方法可手动实现协程,比较原始和复杂。

  二、gevent

  实现协程的高级模块,内部也是依靠greenlet实现的,可以非常高效的提高代码性能。

  (一)手动切换进程

  使用 gevent.sleep(0) 手动控制切换,不常用

# 关于python协程:IO延迟时使用
import gevent
import time

def foo():
    print('running foo:')
    gevent.sleep(0)  # 手动切换进程的标识
    print('over foo.')

def bar():
    print('running bar:')
    gevent.sleep(0)
    print('over bar.')

gevent.joinall([gevent.spawn(foo),gevent.spawn(bar)])
View Code

  (二)自动切换进程

  使用 monkey 模块的 monkey.patch_all 方法,实现进程的自动切换。

# ***协程实例:
from gevent import monkey; monkey.patch_all()

import gevent
import requests

def f(url):
    print('GET: %s' %url)
    resp = requests.get(url)
    data = resp.text
    print(url,len(data))

gevent.joinall([gevent.spawn(f,'https://www.python.org/'),
                gevent.spawn(f,'https://www.yahoo.com/'),
                gevent.spawn(f,'https://www.github.com/'),
                ])