asyncio 同步原语不是线程安全的有什么意义?

An *_*ea. 6 python multithreading python-asyncio

似乎有几个 asyncio 函数,就像这里显示的那样,对于同步原语来说不是线程安全的...由于不是线程安全的,考虑到例如 asyncio.Lock,我假设这个锁不会锁定全局变量,当我们我们的计算机中运行多个线程,因此竞争条件是个问题。

那么,这个不上锁的锁有什么意义呢?(不是批评,而是诚实的怀疑)

这些不安全原语的用途是什么?

Ahm*_*AEK 4

Asyncio 不是为多线程或多处理工作而设计的,它最初是为异步 IO(网络)操作而设计的,开销很小,因此仅在单个线程中运行的锁(就像在 Asyncio eventloop 中运行的任务的情况一样)不会。不需要线程安全或进程安全,因此不需要承受使用线程安全或进程安全锁的额外开销。

添加使用线程和进程执行器只是为了允许将线程未来和多处理未来与无缝运行事件循环未来的应用程序混合在一起,例如将它们传递给函数as_completed或等待它们完成,就像处理普通的非多线程异步任务一样。

如果你想要一个线程安全的锁,你可以使用 thread.Lock 如果你想要一个进程安全的锁,你应该使用multiprocessing.Lock并承受额外的开销。

请记住,这些锁仍然可以在 asyncio eventloop 中工作,并执行与asyncio.Lock几乎相同的功能,它们只是会承受更高的开销,并且在使用时会使您的代码变慢,因此除非您需要代码,否则不要使用它们线程安全或进程安全。

只是简单地解释一下区别,当线程被线程安全锁暂停时,线程将被操作系统暂停并重新调度,这与 Asyncio 锁相比有很大的开销,Asyncio 锁将再次返回到事件循环并继续执行,而不是停止线程。

编辑: athreading.Lock不是 的直接替代asyncio.Lock,相反,您应该使用threading.RLock后跟 anasyncio.Lock来使函数既线程安全又异步安全,因为这将避免线程本身死锁。

Edit2:thread.Lock正如@dano所评论的,如果您希望一个函数同时在线程和异步事件循环中工作,您可以等待间接使用这个问题的答案,但不建议在两者中运行函数无论如何同时如何在异步函数中使用 threading.Lock 而对象可以从多个线程访问