繁体   English   中英

Python threading.Semaphore vs asyncio.Semaphore

[英]Python threading.Semaphore vs asyncio.Semaphore

我最近注意到在 python 的不同包中有两种不同的信号量实现,一种在threading包中,另一种在asyncio包中。 我很好奇这两种实现有什么区别? 如果在异步函数中我尝试使用threading包中的信号量,这会导致任何潜在问题吗?

并通过查看python官方文档,它写道

asyncio primitives are not thread-safe, therefore they should not be used for OS thread synchronization (use threading for that)

但是,说asyncio primitives are not thread-safe and should not be used for OS thread sync什么意思?

提前致谢

信号量的整个目标是提供对某些东西的独占访问。 任何时候只有一个“代码”可以访问自己的信号量。

我在前面的语句中所说的“代码段”是什么意思取决于我使用的是多线程、多处理还是 asyncio。 您保证独占访问的方式取决于我使用的内容。

Asyncio 是最受限制的一种多线程。 一切都在单个 Python 线程中运行。 Python 解释器一次只执行一件事。 每个“代码段”都会运行,直到它自愿等待某事发生。 然后允许运行另一个“代码段”。 最终,当它等待的事情发生时,原始代码再次运行。

使用多线程时,多段代码在 Python 解释器中运行。 任何时候都只有一段代码运行,但它们并没有礼貌地等待对方。 Python根据需要从“代码段”切换到“代码段”。

通过多处理,多个 Python 可以同时运行。 除了操作系统提供的代码外,代码段之间没有共享。 设置信号量通常需要操作系统的一些支持来创建所有线程/进程都可以访问的共享变量。

所以。 Asyncio 原语的设计使得它们都在一个单独的 Python 进程中运行,并且进程相互协作。 如果多段代码试图同时使用它,它们就不能工作。

我希望这有帮助。

您无法选择使用哪个队列或哪个信号量。 它们不兼容。

即使它们都提供并发性, asyncio和多线程也是基于不同原理和 API、具有不同典型用例等的两个完全不同的世界。

多线程程序的开发并不容易,Python 的一个称为 GIL 的特性使它们没有达到应有的效率。 这使得 asyncio 成为首选,除非您被迫使用多线程。


话虽如此,这两种方法都可以在一个程序中使用。

在多线程应用程序的线程之一中运行异步代码是可能的,但并不常见。 文档中引用的通知提醒您,几乎所有异步操作都必须在该线程中执行。 只有少数专门的线程安全低级调度函数

为了完整起见, asyncio库可以利用线程池供其内部使用,因为所谓的阻塞操作不应由异步程序执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM