asyncio 代码可以安全地调用使用 pthread 的本机库吗?

Can asyncio code safely call native libraries that use pthread?

我正在考虑在项目中使用 asyncio。该项目使用将创建 pthreads 的第 3 方库,并回调我的代码。

将项目更改为使用 asyncio 需要进行较大的重写,所以我不能 "try it out",我需要事先了解一些信息。

将 asyncio 和事件循环与在您的代码中使用 pthreads 和回调的第三方库一起使用是否安全?

在 asyncio 的协同程序中,您可以使用任何运行速度相对较快(< 0.05 秒)的函数,否则您可能会阻塞事件循环,并因此导致性能显着下降。

如果函数运行速度相对较慢,它仍然可以在 asycnio 的协程中使用而没有副作用,但只能在 .

中使用

If function returns fast and later calls callback - 这是一个很好的情况。这样的 function/callback 可以使用 asyncio.Future.

转换为 nice asyncio 的 awaitable

另请注意,许多 asyncio 的对象默认情况下不是线程安全的。


长话短说,如果一切都正确实施,我看不出为什么 asyncio 不能安全地与使用线程的第三方库一起使用的原因。

但是在用大型代码库重写某些东西之前,您应该确定 并且恕我直言,在较小的代码库上有一些经验。

尝试采用单个基于回调的函数并将其转换为与 asyncio.Future 的协程。尝试同时执行多个这样的协程。看看你是否实现了你想要的,是否一切顺利。继续往这边走。

包装现有代码以使用 asyncio 而不是重写听起来是个好主意:您可以迭代地执行它,并且只针对您使用的部分。