python协程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘)
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), ])
遇到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/‘), ])
以上是关于python协程的主要内容,如果未能解决你的问题,请参考以下文章