- 多个函数调用同一个异步函数的时候,被调用函数可能在执行同一个参数对象;
-- 例如多个 func() 调用同一个包含 request 功能的异步函数,其请求的 url 可能是同一个 url,这样就会有重复的请求,实际生产中这是不能被允许的;
-- 这个时候就需要使用 asyncio 内置的 Lock,保证 url 不被重复调用,此处的 Lock 是应用级别实现的,并没有没有像线程锁一样深入操作系统;
-- 示例:
import asyncio
from asyncio import Lock
import aiohttp
cache = {}
lock = Lock()
async def get_stuff(url):
# await lock.acquire() #
async with lock:
if url in cache:
return cache[url]
stuff = await aiohttp.request("GET", url=url)
cache[url] = stuff
return stuff
# lock.release() # release 不用 await
async def func_1(url):
"""
异步调用 get_stuff(url)
:return:
"""
stuff_1 = await get_url(url=url)
return stuff_1
async def func_2(url):
"""
异步调用 get_stuff(url)
:return:
"""
stuff_2 = await get_url(url=url)
return stuff_2
url = "xxx"
tasks = [func_1(url), func_2(url)] # 注意:
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
网友评论