Ale*_*sis 4 c python cpython python-c-api
我正在编写一个生成多个C线程的C程序,每个线程一个Python子解释器。子解释器不共享任何可变的Python变量,它们彼此隔离。(它们确实对从C程序的main()函数公开的公共PyObject(不可变)具有只读访问权限)。
在子解释器之间不共享GIL的情况下,是否可以在Python 3.7或3.8中实现?
这是我一直在尝试的伪代码:
void *spawnInterpreter(void* p) {
…
PyThreadState* save_tstate = PyThreadState_Swap(NULL);
PyThreadState* tstate = Py_NewInterpreter();
PyThreadState_Swap(save_tstate);
//do some Python work (with variables that are NOT shared with other thread’s sub-interpreter
PyRun_SimpleString( . . .);
. . .
}
int main() {
...
pthread_create(&thread1, NULL, spawnInterpreter, “in1”);
pthread_create(&thread2, NULL, spawnInterpreter, "in2");
...
}
Run Code Online (Sandbox Code Playgroud)
我可以使它在3.6中工作(无需获取GIL或PyThreadState在C线程中进行管理),但是在Python 3.7中,我得到了:
[New Thread 0x7ffff5f78700 (LWP 16392)]
Fatal Python error: drop_gil: GIL is not locked
Run Code Online (Sandbox Code Playgroud)
不幸的是,子解释器仍然在3.7和3.8中共享GIL。这是我个人正在努力进行的工作。请参阅PEP 554和我的多核Python项目。我还将在下周的PyCon上进行演讲,详细讨论该主题。
我希望能够在Python 3.8中实现这一点,但是目前看来3.9的可能性更大。主要挑战是C-API和CPython运行时不是线程安全的。虽然大多数C-API和运行时都可以切换为使用按解释器的GIL,但在这种情况下,其他事情将不得不更改:
这个问题很容易解决,但是在处理此类关键代码时需要花费一些时间来采取必要的措施。因此可能的目标是3.9。
无论如何,我很感谢您在这里发布。我的大部分努力都集中在对Python代码的影响上,而不是C-API(例如,嵌入程序)上。因此,有关我的项目如何通过C-API与子解释器的使用相关的反馈非常有用。例如,您让我想起的一件事是,通过C-API创建子解释器与PEP 554中的等效方法略有不同。需要更仔细地考虑这一点。同样,PEP 554在C-API中几乎没有公开任何添加。可能没关系,但在短期内与C-API中的渠道进行交互可能很有价值。
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |