是否可以在C模块中使用Python线程来实现真正的并行性?

时间:2018-04-12 05:06:41

标签: python multithreading

我在C中编写了一个使用线程的扩展。为了试图保持跨平台,我使用Apache Portable Runtime包装器来解决与并行性相关的平台特定功能。但是,为Windows用户安装此类软件包将非常痛苦。我所担心的另一个问题是,我并不真正需要整个APR库,只需要处理线程的部分。

在我开始研究这个项目之前,我考虑过这个任务的不同库,在研究Python的线程实现时,我发现的所有导出的API都是处理GIL。原则上,我可以创建线程对象,并让它们运行C函数来完成工作,但是,我想知道它是否有意义? Python线程是否映射到底层操作系统线程(例如,在Linux的情况下为pthreads库),或者它们基本上是asyncio的原型,它们不会并行执行任何工作(也许只能并行等待?我找到的唯一导出的API是与PyThreadState相关的一组函数。我可以在源代码中看到pthreads和NT线程的Python包装器,但它们似乎不适用于扩展。或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

只要C中长时间运行的任务不能访问python对象,就可以使用Python线程包装C代码,这样就可以释放GIL:

  

调用系统I / O函数是最常见的发布用例   GIL,但在调用long-running之前它也很有用   不需要访问Python对象的计算

https://docs.python.org/3/c-api/init.html#thread-state-and-the-global-interpreter-lock