Python多线程扩展 - 线程锁恢复

2024-04-20 15:31:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python的多线程C扩展。它使用3个线程将数据输出到Python中的类。在

我正在使用PyGILState_sure/PyGILState_Release API同步解释器调用。在

扩展中可能存在一些线程被卡住并在调用PyGILState_Release之前被终止的情况。在

我是否可以删除无效的ThreadState并继续使用线程API?在

谢谢


Tags: 数据apirelease情况线程解释器surepygilstate
2条回答

我不完全确定如何终止线程,但在我头脑中的实现中,你会破坏线程对象,不是吗?在这种情况下,你释放了析构函数中的锁。。。在

我建议改变线程之间的交互模式。在

您当前的实现方式如下:

PyGILState_Ensure();
result = doDangerousThing(); // this could kill the thread
storeToPythonObject(result);
PyGILState_Release();

变体A,明显:

^{pr2}$

变型B,不太明显,见[1][2]了解想法:

/* worker_thread.c */
result = doDangerousThing(); // this could kill the thread
putToLocklessQueue(result, *queue_in_main_thread);

/* main_thread.c */
if (hasItems(my_lockless_queue)) {
  PyGILState_Ensure();
  while (hasItems(my_lockless_queue)) {
    storeToPythonObject(popItem(my_lockless_queue));
  }
  PyGILState_Release();
  // sleep again here
}

相关问题 更多 >