首页 > 其他分享 >asyncio.Semaphore

asyncio.Semaphore

时间:2023-05-08 12:22:05浏览次数:28  
标签:协程 Semaphore worker 信号量 semaphore asyncio

 

asyncio.Semaphore是一个异步信号量,用于协调多个协程对共享资源的访问。

异步信号量在协程中的使用方式与线程中的普通信号量类似,但是它是非阻塞的。当信号量的计数器为0时,协程将会被阻塞,直到其他协程释放了该信号量。

 

import asyncio


async def worker(semaphore):
    async with semaphore:
        # do something
        await asyncio.sleep(3)
        print("Done")


async def main():
    semaphore = asyncio.Semaphore(5)
    tasks = [worker(semaphore) for _ in range(10)]
    await asyncio.gather(*tasks)
    print("Done all")


asyncio.run(main())

 

 

 

在上面的代码中,我们创建了一个大小为5的异步信号量,并创建了10个worker协程来尝试获取信号量。每个worker协程使用async with语句获取信号量,当信号量的计数器为0时,协程将会被阻塞,直到其他协程释放了该信号量。

最后,我们使用asyncio.gather()函数来等待所有worker协程完成。

标签:协程,Semaphore,worker,信号量,semaphore,asyncio
From: https://www.cnblogs.com/angdh/p/17381349.html

相关文章

  • 《asyncio 系列》7. 在 asyncio 中引入多线程
    楔子在从头开始开发新的IO密集型应用程序时,asyncio可能是首选技术,并且也要使用与asyncio搭配工作的非阻塞库,如asyncpg、aiohttp等等。然而我们工作的很大一部分可能是使用阻塞IO库管理现有的代码,例如对HTTP发请求的requests,用于PostgreSQL数据库的psycopg2,或其他......
  • python asyncio
    例子importasyncioasyncdefmain():print("hello")awaitasyncio.sleep(1)print("world")asyncio.run(main())主要函数task=asyncio.create_tas()res=awaitasyncio.gather(task1,task2)#res:list获取返回值res=awaittask......
  • 《asyncio 系列》6. 在 asyncio 中引入多进程
    楔子到目前为止我们使用asyncio获得的性能提升,一直专注在并发运行IO密集型工作上面,当然运行IO密集型工作是asyncio的主要工作,并且按照目前编写代码的方式,需要注意不要在协程中运行任何的CPU密集型代码。但这似乎严重限制了asyncio的使用,因为这个库能做的事情不仅仅限......
  • 《asyncio 系列》5. 基于 asyncio + SQLAlchemy 并发请求数据库
    楔子上一篇文章探讨了使用aiohttp库发出非阻塞Web请求,还讨论了使用几种不同的异步API来同时运行这些请求。通过结合asyncioAPI和aiohttp库,可以同时运行多个耗时的Web请求,从而提高应用程序的运行速度。但我们上一章学到的概念不仅适用于Web请求,也适用于运行SOL查......
  • 《asyncio 系列》4. 如何并发运行多个任务(asyncio.gather、asyncio.as_completed、asy
    楔子在上一篇文章中,我们了解了套接字的内部工作原理,并构建了一个基本的回显服务器。现在我们将学到的知识应用到并发的、非阻塞的Web请求中,基于asyncio可以并发发送大量的Web请求,缩短应用程序的运行时间。当我们必须向一组RESTAPI发出多个请求时,这很有用,比如在微服务架......
  • 20 同步与互斥(六)semaphore
    1简介semaphore信号量;需要注意的是信号量不是信号。信号量是一种同步、互斥机制2semaphore的结构和API2.1semaphore结构structsemaphoresem;structsemaphore{ raw_spinlock_t lock; //semaphore借助与spinlock实现 unsignedint count; //允许多少人使......
  • 异步爬虫例子之asyncio
    异步爬虫例子:importtimeimportaiohttpimportasyncioimportreimportosos.environ['NO_PROXY']='www.baidu.com'classAsyn():def__init__(self):self.__headers={'authority':......
  • 《asyncio 系列》3. 详解 Socket(阻塞、非阻塞),以及和 asyncio 的搭配
    楔子在前面两篇文章中,我们介绍了协程、任务和事件循环,研究了如何同时运行长耗时的操作,并探索了一些可以优化此操作的asyncioAPI。然而,到目前为止,我们只是用asyncio.sleep函数模拟了长时间的操作。由于我们想要构建的不仅是演示应用程序,因此我们将使用一些真实世界的阻塞操作......
  • 《asyncio 系列》2. 详解 asyncio 的协程、任务、future,以及事件循环
    楔子上一篇文章我们深入讨论了并发性,探讨了如何同时使用进程和线程实现并发,还探索了如何利用非阻塞IO和事件循环来实现只使用一个线程的并发性。本篇文章将介绍在asyncio中使用单线程并发模型编写程序的基础知识,使用本文中的技术,你将能执行长时间运行的操作,如Web请求、数据......
  • Semaphore源码分析
    1、Semaphore介绍计数信号量-Semaphore,常用来限制访问资源的线程数量。优点类似限流中的令牌桶算法,只有拿到信号量的线程才能执行,与令牌桶算法未拿到令牌不处理请求不同的是,在Semaphore中未拿到信号量的线程会阻塞等待,直到有某个线程释放了持有的信号量。2、Semaphore使用......