ITPub博客

首页 > 应用开发 > > 异步协程函数详解!五分钟掌握它有没有问题?

异步协程函数详解!五分钟掌握它有没有问题?

作者:westwolf 时间:2019-10-17 13:28:51 0 删除 编辑

一枚程序媛呀 



一、 asyncio

1.python3.4开始引入标准库之中,内置对异步io的支持

2.asyncio本身是一个消息循环

3.步骤:

(1)创建消息循环

(2)把协程导入

(3)关闭


4.举例:

import threading#引入异步io包import asyncio#使用协程@asyncio.coroutinedef hello(): print("Hello World!(%s)"%threading.current_thread()) print("Start......(%s)"%threading.current_thread()) yield from asyncio.sleep(5) print("Done.....(%s)"%threading.current_thread()) print("Hello again!(%s)"%threading.current_thread())#启动消息循环loop = asyncio.get_event_loop()#定义任务tasks = [hello(),hello()]#asyncio使用wait等待task执行完毕loop.run_until_complete(asyncio.wait(tasks))#关闭消息循环loop.close()


二、asyncio and await

1.为了更好的表示异步io

2.python3.5引入

3.让协程代码更加简洁

4.使用上,可以简单的进行替换

(1)用async来替换@asyncio,coroutine

(2)用await来替换yield from

按照上面这个语法可以来改写前面的例子,运行结果是完全一致的

三、aiohttp

1.asyncio实现单线程的并发io,在客户端用处不大

2.在服务端可以asyncio+coroutine配合,因为http是io操作

3.asyncio实现了tcp,udp,ssl等协议

4.aiohttp是基于asyncio实现的http框架

5.例子:

import asynciofrom aiohttp import web
async def index(request): await asyncio.sleep(0.5) return web.Response(body=b"<h1>Index</h1>")
async def hello(request): await asyncio.sleep(0.5) text = "<h1>hello,%s!</h1>"%request.match_info["name"] return web.Response(body=text.encode("utf-8"))
async def init(loop): app = web.Application(loop=loop) app.router.add_route("GET","/",index) app.router.add_route("GET","/hellp/{name}",hello) srv = await loop.create_server(app.make_handler(),"127.0.0.1",8000) print("Server started at http://127.0.0.1:8000...") return srv
loop = asyncio.get_event_loop()


三、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参数

import timefrom concurrent.futures import ThreadPoolExecutor
def return_future(msg): time.sleep(3) return msg
#创建一个线程池pool = ThreadPoolExecutor(max_workers = 2)#参数是2,代表里面有两个线程干活#往线程池里面加入两个taskf1 = 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())


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4662/viewspace-3156680/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-07-26

  • 博文量
    307
  • 访问量
    21681