Вопрос

Допустим, у меня есть скрипт Python, который загружает общую библиотеку (SL) через ctypes.

  • SL устанавливает pthread Т1
  • Скрипт Python настраивает обратные вызовы через SL, т.е.Скрипт Python вызывает функции из SL со ссылками на вызываемые объекты Python

альтернативный текст http://www.gliffy.com/pubdoc/1993061/L.jpg

Теперь предположим, что T1 вызывает функцию «обратного вызова», верны ли следующие предположения:

  • функция обратного вызова на стороне Python выполняется в контексте T1
  • я могу использовать очередь для связи между T1 и виртуальной машиной Python
  • мне нужно будет опросить сказанное queue на стороне виртуальной машины Python

Я понимаю все концепции потоков, общего состояния и т. д.но я не очень глубоко копал многопоточность Python.Поскольку существует уровень адаптации, о котором я пока недостаточно знаю (ctypes), боюсь, я упущу некоторые ключевые аспекты процесса.

Это было полезно?

Решение

Опрос очереди обычно не требуется (вы можете выделить другой поток на стороне Python для выполнения блокировки). .get призывает его), но это не имеет большого значения.Проблема в том, что при таком раскладе вы можете попасться ГИЛ - см. три ссылки на этой странице в Википедии, чтобы получить подробную информацию об этом.

Когда вы взаимодействуете с C/с C (или Китон) код, использующий API Python C, вы можете выпускать и получать GIL довольно просто, по крайней мере, надеясь избежать взаимоблокировок и тому подобного;с помощью ctypes операции GIL автоматизируются в ситуациях обратного вызова в/из C, поэтому, если есть какая-либо другая блокировка, тупиковая ситуация представляет собой риск (поскольку все находится вне вашего контроля, вы не можете легко гарантировать, что Джикстра Алгоритм Банкира применены).

Другие советы

Это можно легко реализовать с помощью Cython.Я написал образец наhttps://github.com/sachinpc/cython/tree/master/Demos/mt_callback

В примере показано, как обернуть обратный вызов Python в Cython при вызове из pthread.Для вашего конкретного случая использования вы можете добавить объект Queue или dequeue в код потока из функции обратного вызова.В том же Ple я добавил отпечатки как для pthread-id, так и для python-thread-id в расширении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top