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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asyncio代码可以安全地调用使用pthread的本机库吗?相关的知识,希望对你有一定的参考价值。

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

将项目更改为使用asyncio需要稍微大量的重写,所以我不能只是“试一试”,我需要事先获得一些信息。

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

答案

在asyncio的协同程序中,如果它运行相对较快(<0.05秒),你可以使用任何函数,否则你可能会阻止事件循环,并且通过这会导致性能显着下降。

如果函数运行相对较慢,它仍然可以在asycnio的协同程序中使用,没有副作用,但只在executor内部。

如果函数快速返回,后来调用回调 - 这是一个很好的情况。这样的函数/回调可以使用asyncio.Future转换为好的asyncio等待。

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


长话短说,我不明白为什么asyncio无法安全地与使用线程的第三方库一起使用,如果一切正确实现的话。

但是在你用大型代码库重写某些东西之前,你应该知道某些why you need asyncio,而且,恕我直言,在较小的代码库上有一些经验。

尝试使用单个基于回调的函数并使用asyncio.Future将其强制转换为协同程序。尝试同时执行多个这样的协同程序。看看你是否达到了你想要的,如果一切顺利的话。继续这样做。

包装现有代码以使用asyncio而不是重写听起来是个好主意:您可以迭代地执行此操作,仅适用于您使用的部分。

以上是关于asyncio代码可以安全地调用使用pthread的本机库吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 asyncio.Queue 将数据从子进程安全地传递到异步任务

PIL 和使用 asyncio 阻塞调用

Python asyncio:处理潜在的无限列表

pthread并在C中递归调用execvp

结合 2 个基于 asyncio 的代码段

gj13 asyncio并发编程