线程池
from multiprocessing.dummy import Pool pool = Pool(num) # num 开启的线程数 pool.map(backfunc,iterable) # 可迭代对象 仅且只有一个参数传如 回调函数内
单线程+异步协程 (requests模块是一个非异步的模块, 支持异步的网络请求模块:aiohttp)
事件监视器 内放 任务 task 内放 协程
event_loop:事件监听器 一直循环监听, 内放一些函数 用来调用 # loop = asyncio.get_event_loop() 创建事件循环对象 # loop.run_until_complete(c) 将协程注册到事件循环对象 启动事件循环 coroutine:协程 async 关键字定义 + 函数 这个方法在调用时不会立即被执行,而是返回一个协程对象 # async def func():pass # c = func() task:任务,它是对协程对象的进一步封装,包含了任务的各个状态 # task = loop.create_task(c) 对协程对象进行 进一步封装 # loop.run_until_complete(task) 将任务注册 并启动 future:代表将来执行或还没有执行的任务,实际上和 task 没有本质区别。 # task = asyncio.ensure_future(c) # loop.run_until_complete(task)
绑定回调(task)
def callback(task): print('i am callback:',task.result()) import asyncio async def hello(name): print('hello to :',name) return name c = hello('bobo') task = asyncio.ensure_future(c) task.add_done_callback(callback) #给任务对象绑定一个回调函数 loop.run_until_complete(task)
多任务异步协程
import asyncio async def request(url): print('正在下载:',url) #### sleep(2) #非异步模块的代码:在此处如果存在非异步操作代码,则会彻底让asyncio失去异步的效果 await asyncio.sleep(2) print('下载成功:',url) urls = [ 'www.baidu.com', 'www.taobao.com', 'www.sogou.com' ] start = time.time() loop = asyncio.get_event_loop() tasks = [] #任务列表,放置多个任务对象 for url in urls: c = request(url) task = asyncio.ensure_future(c) tasks.append(task) #将多个任务对象对应的列表注册到事件循环中 loop.run_until_complete(asyncio.wait(tasks)) print('总耗时:',time.time()-start)
aiohttp 异步请求模块
import aiohttp import asyncio async def get_page(url): async with aiohttp.ClientSession() as session: async with await session.get(url=url) as response: page_text = await response.text() #read() json() print(page_text) start = time.time() urls = [ 'http://127.0.0.1:5000/bobo', 'http://127.0.0.1:5000/jay', 'http://127.0.0.1:5000/tom', 'http://127.0.0.1:5000/bobo', 'http://127.0.0.1:5000/jay', 'http://127.0.0.1:5000/tom', 'http://127.0.0.1:5000/bobo', 'http://127.0.0.1:5000/jay', 'http://127.0.0.1:5000/tom' ] tasks = [] loop = asyncio.get_event_loop() for url in urls: c = get_page(url) task = asyncio.ensure_future(c) tasks.append(task) loop.run_until_complete(asyncio.wait(tasks)) print('总耗时:',time.time()-start)