python协程

线程和进程的操作是由程序触发系统接口,最后的执行者是系统,协程的操作则是人为。

协程存在的意义:对于多线程应用,cpu通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程则只使用一个线程,在一个线程中规定某个代码块执行顺序。

协程的使用场景:当程序中存在大量不需要cpu的操作时(IO),适用于协程。

greenlet:需要提前安装(pip3 install greenlet,安装完greenlet后gevent也就安装上了)

from greenlet import greenlet


def foo1():
    print('I am foo1-gl1')
    gl2.switch()
    print('Who am I?')
    gl2.switch()


def foo2():
    print('I am foo-gl2')
    gl1.switch()
    print('Who am I?.')


gl1 = greenlet(foo1)
gl2 = greenlet(foo2)
gl1.switch()
print('end')
greenlet
import gevent, time


def foo():
    print('Running in foo')
    gevent.sleep(0)     #通过sleep去切换到另一个任务
    print('Explicit context switch to foo again.')


def bar():
    print('Explicit context switch to back to bar')
    gevent.sleep(1)
    print('我睡醒了')


def func():
    print('Explicit context switch to func.')
    gevent.sleep(0)
    print('I am come back')

gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
    gevent.spawn(func),
])
gevent

遇到IO操作自动切换:

# monkey.patch_all()为将原来socket修改为自己的socket去发送http请求
from gevent import monkey; monkey.patch_all()
import gevent, requests


def f(url):
    print('Get: ',url)
    resp = requests.get(url)
    data = resp.text
    with open('test', 'w', encoding='utf-8') as f:
        f.write(data)
    print('%d bytes recceved from %s' % (len(data), url))

gevent.joinall([
    gevent.spawn(f, 'https://www.baidu.com/'),
    gevent.spawn(f, 'https://www.yahoo.com/'),
    gevent.spawn(f, 'https://www.github.com/'),
])
原文地址:https://www.cnblogs.com/caibao666/p/6773135.html