协程
-
1、是操作系统不可见的
-
2、协程本质就是一条线程,多个任务在一条线程上来回切换
-
3、利用协程这个概念实现的内容:来规避io操作,就达到我们将一条线程中的io操作降到最低的目的
-
进程:数据隔离、数据不安全、操作系统级别、开销非常大、能利用多核
-
线程:数据共享、数据不安全、操作系统级别、开销小、不能利用多核、一些和文件操作相关的io只有操作系统能感知到
-
协程:数据共享、数据安全、用户级别、开销更小、不能利用多核、协程的所有的切换都是基于用户,只有在用户级别能够
#感知到的io才会用协程 -
用户级别的协程还有什么好处:
- 1、减轻了操作系统的负担
- 2、一条线程如果开了多个协程、那么给操作系统的印象是线程很忙、这样能多争取一些时间片来被CPU执行,程序的
#效率就提高了
最简单的版本
from gevent import monkey
monkey.patch_all()
import time
import gevent
def fun(): #带有io操作的内容写在函数里,然后提交fun给gevent
print('start fun')
time.sleep(1)
print('end fun')
g1 = gevent.spawn(fun)
g2 = gevent.spawn(fun)
g3 = gevent.spawn(fun)
gevent.joinall([g1,g2,g3])
g1.join() #阻塞,直到协程g1任务执行结束
g2.join() #阻塞,直到协程g2任务执行结束
g3.join() #阻塞,直到协程g3任务执行结束
asyncio
import asyncio
async def fun(name):
print('start',name)
# await 后面接可能会发生阻塞的方法
#await 关键字必须写在一个async函数里
await asyncio.sleep(1)
print('end')
loop = asyncio.get_event_loop()
# loop.run_until_complete(fun('test'))#
loop.run_until_complete(asyncio.wait([fun('test1'),fun('test2')])) #异步启用多个
8万+

被折叠的 条评论
为什么被折叠?



