Python-携程

Posted by kingkk on 2018-02-13

简介

通俗的讲,就是在几个函数之间切换 在某个函数阻塞时,切换到另一个等待运行的函数之中。阻塞停止时,再从之前阻塞的地方继续执行。以此提升cpu的利用率 携程是在同一个线程之下进行的,不需要开辟新的线程,减少了线程直接切换的cpu消耗

正文

python中完成携程是通过生成器来实现的,顺带提一下几个函数的作用

  • **generator.send(args)** 使yield x拥有一个返回值args
  • **yield from generator** 类似于一个装饰器,在原有生成器基础上,增添一些头尾功能,返回新的生成器
pyton3.4引入asyncio标准库,提供对异步I/O的支持

import asyncio

@asyncio.coroutine #将一个生成器标记为协同类型
def hello():
print(‘Hello world!’)
yield from asyncio.sleep(1) #调用异步的asyncio.sleep(1)
print(‘Hello again!’)

loop = asyncio.get_event_loop() #生成event_loop
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks)) #将携程放入event_loop执行
loop.close()

python3.5新增的async/await对携程进行了优化

import asyncio

async def hello():
print(“Hello world!”)
r = await asyncio.sleep(1)
print(“Hello again!”)

loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

相当于async替换了@asyncio.coroutine, await替换了yield from

总结

我后来尝试了下,自定义个一个生成器,然后加载await后面,但是并不能运行成功 具体原因好像是因为自定义的生成器并不是异步的,假如真的要自己写异步那工作量就实在有点大了 然后python提供的支持异步的操作除了asyncio下的一些函数,还有aiohttp库所提供的函数 不过不能自定义确实很蛋疼,而且提供的函数并没有很全面,导致感觉甚至这个携程有些鸡肋 总感觉python的携程也在发展当中,毕竟3.4才内置的异步I/O支持,希望未来能有些好用的库吧,携程就当了解了解了