Python 异步协程函数原理及实例详解
这篇文章主要介绍了Python异步协程函数原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一、asyncio
1.python3.4开始引入标准库之中,内置对异步io的支持
2.asyncio本身是一个消息循环
3.步骤:
(1)创建消息循环
(2)把协程导入
(3)关闭
4.举例:
importthreading #引入异步io包 importasyncio #使用协程 @asyncio.coroutine defhello(): print("HelloWorld!(%s)"%threading.current_thread()) print("Start......(%s)"%threading.current_thread()) yieldfromasyncio.sleep(5) print("Done.....(%s)"%threading.current_thread()) print("Helloagain!(%s)"%threading.current_thread()) #启动消息循环 loop=asyncio.get_event_loop() #定义任务 tasks=[hello(),hello()] #asyncio使用wait等待task执行完毕 loop.run_until_complete(asyncio.wait( tasks)) #关闭消息循环 loop.close()
二、asyncioandawait
1.为了更好的表示异步io
2.python3.5引入
3.让协程代码更加简洁
4.使用上,可以简单的进行替换
(1)用async来替换@asyncio,coroutine
(2)用await来替换yieldfrom
按照上面这个语法可以来改写前面的例子,运行结果是完全一致的
三、aiohttp
1.asyncio实现单线程的并发io,在客户端用处不大
2.在服务端可以asyncio+coroutine配合,因为http是io操作
3.asyncio实现了tcp,udp,ssl等协议
4.aiohttp是基于asyncio实现的http框架
5.例子:
importasyncio fromaiohttp importweb asyncdefindex(request): awaitasyncio.sleep(0.5) returnweb.Response(body=b"Index
") asyncdefhello(request): awaitasyncio.sleep(0.5) text="hello,%s!
"%request.match_info[ "name"] returnweb.Response(body=text.encode( "utf-8")) asyncdefinit(loop): app=web.Application(loop=loop) app.router.add_route("GET","/",index) app.router.add_route("GET", "/hellp/{name}",hello) srv=awaitloop.create_server(app.make_handler(), "127.0.0.1",8000) print( "Serverstartedathttp://127.0.0.1:8000..." ) returnsrv loop=asyncio.get_event_loop() loop.run_until_complete(init(loop)) loop.run_forever()
四、current,futures
1.python3新增的库
2.类似其它语言的线程池的概念
3.利用multiprocessing实现真正的并行计算(当然要求我们的CPU是多核的)
4.核心原理:以子进程的形式,实现多个python解释器
从而令python程序,可以利用多核CPU来提升执行速度。由于子进程于主解释器相分离,所以他们的全局解释器锁也是相互独立的,每个子进程都能完整的使用一个CPU内核
5.concurrent.futures.Executor
(1)ThreadPoolExecutor
(2)ProcessPoolExecutor
(3)执行的时候需要自行选择
(4)submit(fn,args,kwargs)
fn:异步执行的函数
args,kwargs参数
importtime fromconcurrent.futures importThreadPoolExecutor defreturn_future(msg): time.sleep(3) returnmsg #创建一个线程池 pool=ThreadPoolExecutor(max_workers= 2)#参数是2,代表里面有两个线程干活 #往线程池里面加入两个task f1=pool.submit(return_future,"hello") f2=pool.submit(return_future,"world") time.sleep(1) #等待执行完毕 print(f1.done()) time.sleep(3) print(f2.done()) #结果 print(f1.result()) print(f2.result())
源码
d28_1_asynchronization_examples.py
https://github.com/ruigege66/Python_learning/blob/master/d28_1_asynchronization_examples.py
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。