Многопоточное расширение Python - восстановление блокировки потока - PullRequest
0 голосов
/ 13 марта 2011

У меня есть многопоточное расширение C для Python. Он выводит данные в класс в Python, используя 3 потока.

Я использую API PyGILState_Ensure / PyGILState_Release для синхронизации вызовов интерпретатора.

В расширении возможны случаи, когда некоторые потоки зависают и завершаются до вызова PyGILState_Release.

Могу ли я в любом случае удалить этот недопустимый ThreadState и продолжить использовать API потоков?

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 марта 2011

Я бы предложил изменить схему взаимодействия между потоками.

Ваша текущая реализация работает следующим образом:

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
}
0 голосов
/ 13 марта 2011

Я не совсем уверен, как вы прервете свои потоки, но в реализации, которую я имею в своей голове, вы бы уничтожили объект потока, не так ли? В этом случае вы снимаете блокировку в деструкторе ...

...