我在C中编写了一个使用线程的扩展。为了试图保持跨平台,我使用Apache Portable Runtime包装器来解决与并行性相关的平台特定功能。但是,为Windows用户安装此类软件包将非常痛苦。我所担心的另一个问题是,我并不真正需要整个APR库,只需要处理线程的部分。
在我开始研究这个项目之前,我考虑过这个任务的不同库,在研究Python的线程实现时,我发现的所有导出的API都是处理GIL。原则上,我可以创建线程对象,并让它们运行C函数来完成工作,但是,我想知道它是否有意义? Python线程是否映射到底层操作系统线程(例如,在Linux的情况下为pthreads
库),或者它们基本上是asyncio
的原型,它们不会并行执行任何工作(也许只能并行等待?我找到的唯一导出的API是与PyThreadState
相关的一组函数。我可以在源代码中看到pthreads
和NT线程的Python包装器,但它们似乎不适用于扩展。或者我错过了什么?
答案 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