美文网首页
并发:asyncio 中 Lock 使用

并发:asyncio 中 Lock 使用

作者: dex0423 | 来源:发表于2020-07-31 22:15 被阅读0次
  • 多个函数调用同一个异步函数的时候,被调用函数可能在执行同一个参数对象;
    -- 例如多个 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))


相关文章

网友评论

      本文标题:并发:asyncio 中 Lock 使用

      本文链接:https://www.haomeiwen.com/subject/thflrktx.html