美文网首页
并发: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