Настоящая многопоточность с boost.python - PullRequest
8 голосов
/ 13 декабря 2011

Я пытаюсь протестировать многопоточную C ++ DLL. Эта DLL должна быть поточно-ориентированной. Я завернул его в boost.python, и я хотел бы создать несколько потоков Python для работы с DLL через оболочку boost.python. Я на самом деле пытаюсь вызвать проблемы с многопоточностью.

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

Может ли кто-нибудь описать или отослать меня к описанию вызывающих Python модулей DLL из нескольких потоков и как предполагается использовать GIL в этом случае?

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011

Как освободить GIL при вызове функции C ++ из Python через Boost.Pyhton:

http://wiki.python.org/moin/boost.python/HowTo#Multithreading_Support_for_my_function

1 голос
/ 05 декабря 2013

Ответ - нет, GIL никогда не будет действительно многопоточным, если DLL не снимет блокировку вручную. Python позволяет запускать ровно один поток за раз, если расширение не говорит вручную: «Я заблокирован, продолжайте без меня». Обычно это делается с помощью макроса Py_BEGIN_ALLOW_THREADS (и отменяется с помощью Py_END_ALLOW_THREADS), определенного в python include / ceval.h. Как только расширение сделает это, python разрешит запуск другого потока, и первый поток, выполняющий какие-либо действия с python, вероятно, вызовет проблемы (как отмечено в вопросе о комментариях). Это действительно предназначено для блокировки ввода-вывода или тяжелого времени вычислений.

...