首页 > 代码库 > python协程
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协程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。