博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asyncio 学习
阅读量:6965 次
发布时间:2019-06-27

本文共 3252 字,大约阅读时间需要 10 分钟。

#事件循环+回调(驱动生成器)+epoll(IO多路复用)#asyncio是python用于解决异步io编程的一整套解决方案#tornado、gevent、twisted(scrapy, django channels)#torando(实现web服务器), django+flask(uwsgi, gunicorn+nginx)#tornado可以直接部署, nginx+tornado#使用asyncio# import asyncio# import time# async def get_html(url):#     print("start get url")#     await asyncio.sleep(2)#     print("end get url")## if __name__ == "__main__":#     start_time = time.time()#     loop = asyncio.get_event_loop()#     tasks = [get_html("http://www.imooc.com") for i in range(10)]#     loop.run_until_complete(asyncio.wait(tasks))#     print(time.time()-start_time)#获取协程的返回值# import asyncio# import time# from functools import partial #给函数添加参数# async def get_html(url):#     print("start get url")#     await asyncio.sleep(2)#     return "bobby"## def callback(url, future):#     print(url)#     print("send email to bobby")## if __name__ == "__main__":#     start_time = time.time()#     loop = asyncio.get_event_loop()#     # get_future = asyncio.ensure_future(get_html("http://www.imooc.com"))#     task = loop.create_task(get_html("http://www.imooc.com"))#     task.add_done_callback(partial(callback, "http://www.imooc.com"))#     loop.run_until_complete(task)#     print(task.result())#wait 和 gatherimport asyncioimport timeasync def get_html(url):    print("start get url")    await asyncio.sleep(2)    print("end get url")if __name__ == "__main__":    start_time = time.time()    loop = asyncio.get_event_loop()    tasks = [get_html("http://www.imooc.com") for i in range(10)]    # loop.run_until_complete(asyncio.gather(*tasks))    # print(time.time()-start_time)    #gather和wait的区别    #gather更加high-level 可以分组运行,分组取消    group1 = [get_html("http://projectsedu.com") for i in range(2)]    group2 = [get_html("http://www.imooc.com") for i in range(2)]    group1 = asyncio.gather(*group1)    group2 = asyncio.gather(*group2)    group2.cancel()    loop.run_until_complete(asyncio.gather(group1, group2))    print(time.time() - start_time)

 

  • event_loop 事件循环:程序开启一个无限循环,把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数

  • coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。

  • task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含了任务的各种状态

  • future: 代表将来执行或没有执行的任务的结果。它和task上没有本质上的区别

  • async/await 关键字:python3.5用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。

 

task取消和子协程调用原理

#1. run_until_complete# import asyncio# loop = asyncio.get_event_loop()# loop.run_forever()# loop.run_until_complete()#1. loop会被放到future中#2. 取消future(task)# import asyncio# import time## async def get_html(sleep_times):#     print("waiting")#     await asyncio.sleep(sleep_times)#     print("done after {}s".format(sleep_times))### if __name__ == "__main__":#     task1 = get_html(2)#     task2 = get_html(3)#     task3 = get_html(3)##     tasks = [task1, task2, task3]##     loop = asyncio.get_event_loop()##     try:#         loop.run_until_complete(asyncio.wait(tasks))#     except KeyboardInterrupt as e:#         all_tasks = asyncio.Task.all_tasks()#         for task in all_tasks:#             print("cancel task")#             print(task.cancel())#         loop.stop()#         loop.run_forever()#必须添加,否则会有异常#     finally:#         loop.close()#注册协程到loop中有两种方法#1. 通过ensure_future/create_task#2. await

 

转载于:https://www.cnblogs.com/Erick-L/p/8932183.html

你可能感兴趣的文章
【转】C++拷贝构造函数详解
查看>>
复旦大学高等代数考试命题的若干经验
查看>>
自主学习Flappy Bird游戏
查看>>
gitlab pipelines 使用
查看>>
哪些情况下索引会失效?
查看>>
UWP开发随笔——UWP新控件!AutoSuggestBox!
查看>>
Nginx+mysql+php(待补全)
查看>>
75.培训管理-培训信息发布 Extjs 页面
查看>>
[转]使用rosbridge协议实现安卓跟ros的解耦
查看>>
maven添加jetty插件,同时运行多个实例
查看>>
洛谷 P3807 【模板】卢卡斯定理
查看>>
mac使用phpize进行安装的时候碰到的问题
查看>>
前端插件实现图片懒加载
查看>>
jquery绑定onkeyup()事件3中方法
查看>>
正则表达式总结
查看>>
WPS或xls 数据分列 清洗
查看>>
HTML Entity 字符实体(字符转义)
查看>>
Linux实时流量监控工具 - iftop
查看>>
基于 HTML5 WebGL 的 3D 场景中的灯光效果
查看>>
怎么样才能让工作经验值钱
查看>>