最近都涉及到高并发的处理,之前用的是threading模块,不过在python 3.4后出了asyncio模块,这个模块对并发的处理非常高效,所以让我有了学习他的兴趣。
    文档地址:
    https://docs.python.org/zh-cn/3/library/asyncio.html
    首先我们来看一下官方介绍,官方文档介绍的就是用来编写并发代码的库。使用 async/await 语法。所以这本来就是用来处理并发问题比较好的选择。
    高并发:所谓高并发 要有event loop(事件循环),epoll (事件监听机制,可以监听多个)多个网络的IO

    1. # 同步代码
    2. import asyncio
    3. import time
    4. from aiohttp import ClientSession
    5. # 协程
    6. async def hello():
    7. while True:
    8. print('hello world:%s' % time.time())
    9. await asyncio.sleep(1)
    10. async def good():
    11. while True:
    12. print('good:%s' % time.time())
    13. await asyncio.sleep(1)
    14. # 创建协程对象,并没有执行
    15. co1 = hello()
    16. co2 = good()
    17. loop = asyncio.get_event_loop() # epoll
    18. loop.run_until_complete(asyncio.gather(co1,co2)) # 运行future

    使用async关键字修饰一个任务(函数),这时候函数就不再是函数了,而变成了一个携程,当运行到 await 的时候该协程就会被阻塞,而执行另外的协程,从而达到并发的效果。

    1. import asyncio
    2. import functools
    3. import random
    4. # 回调函数
    5. def on_job_done(url, task):
    6. print('结束:', url)
    7. async def cron_scheduler():
    8. page = 1
    9. while True:
    10. url = cron_job('{}/{}'.format('www.sina.com', page))
    11. job = cron_job(url)
    12. task = asyncio.create_task(job)
    13. # 如果需要返回结果
    14. # future = asyncio.ensure_future(job)
    15. # future.result()
    16. task.add_done_callback(functools.partial(url, on_job_done))
    17. await asyncio.sleep(0)
    18. page += 1
    19. async def cron_job(url):
    20. n = random.randint(0, 3)
    21. await asyncio.sleep(n)
    22. asyncio.run(cron_scheduler())