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

时间:2011-03-12 23:55:40

标签: python python-multithreading

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

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

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

无论如何我可以删除无效的ThreadState并继续使用线程API吗?

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

您当前的实施似乎是这样的:

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

变体A,显而易见:

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

变体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
}