pthread с обратным вызовом в Python VM - PullRequest
4 голосов
/ 16 февраля 2010

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 16 февраля 2010

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

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

0 голосов
/ 27 июля 2015

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

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

...