最近都涉及到高并发的处理,之前用的是threading模块,不过在python 3.4后出了asyncio模块,这个模块对并发的处理非常高效,所以让我有了学习他的兴趣。
文档地址:
https://docs.python.org/zh-cn/3/library/asyncio.html
首先我们来看一下官方介绍,官方文档介绍的就是用来编写并发代码的库。使用 async/await 语法。所以这本来就是用来处理并发问题比较好的选择。
高并发:所谓高并发 要有event loop(事件循环),epoll (事件监听机制,可以监听多个)多个网络的IO
# 同步代码import asyncioimport timefrom aiohttp import ClientSession# 协程async def hello():while True:print('hello world:%s' % time.time())await asyncio.sleep(1)async def good():while True:print('good:%s' % time.time())await asyncio.sleep(1)# 创建协程对象,并没有执行co1 = hello()co2 = good()loop = asyncio.get_event_loop() # epollloop.run_until_complete(asyncio.gather(co1,co2)) # 运行future
使用async关键字修饰一个任务(函数),这时候函数就不再是函数了,而变成了一个携程,当运行到 await 的时候该协程就会被阻塞,而执行另外的协程,从而达到并发的效果。
import asyncioimport functoolsimport random# 回调函数def on_job_done(url, task):print('结束:', url)async def cron_scheduler():page = 1while True:url = cron_job('{}/{}'.format('www.sina.com', page))job = cron_job(url)task = asyncio.create_task(job)# 如果需要返回结果# future = asyncio.ensure_future(job)# future.result()task.add_done_callback(functools.partial(url, on_job_done))await asyncio.sleep(0)page += 1async def cron_job(url):n = random.randint(0, 3)await asyncio.sleep(n)asyncio.run(cron_scheduler())
