前言
在最近的项目中,需要实现一个周期性执行的定时器。第一个想法是用celery,但是看了一下之后发现针对这个简单的需求,celery还是太大了,有点杀鸡焉用牛刀的感觉。正好之前在看coroutine的东西,于是就在这方面试试。但是也遇到了好多问题吧,本文就是针对这些问题的总结,希望对大家有所帮助。
先放两个链接,是我学习coroutine时候看到的,感觉讲的挺好的,有必要后面翻译一下。
AsyncIO for the Working Python Developer
I don't understand Python's Asyncio
我都是用的Python3.5中添加的async/await来定义coroutine,所以本文适用于3.5和3.6。
Q1、coroutine的运行
根据官网的文档,有两个方法可以运行coroutine,run_forever
和run_until_complete
。
run_until_complete
import asyncio
async def hello():
await asyncio.sleep(1)
print('Hello')
return 'World'
loop = asyncio.get_event_loop()
r = loop.run_until_complete(hello())
print(r)
loop.close()
# result
Hello
World
run_until_complete
等待hello
运行完,返回hello
的结果。
run_forever
import asyncio
async def hello(future):
await asyncio.sleep(1)
print('Hello')
future.set_result('World')
def callback(future):
print(future.result())
loop.stop()
loop = asyncio.get_event_loop()
ft = asyncio