Производится ли расширения Python Cython/Pyrex Threadsafe?
-
22-09-2019 - |
Вопрос
Если нет, то есть ли способ гарантировать безопасность потока путем программирования определенным образом?
Чтобы уточнить, говоря о «Threadsafe», я имею в виду потоки Python, а не потоки уровня ОС.
Решение
Все зависит от взаимодействия между вашим кодом цинтона и GIL Python, как подробно задокументировано здесь. Анкет Если вы не делаете ничего особенного, Cython-генерируемый код будет уважать GIL (как и расширение C-кодирования C, которое не использует макросы, выделяющие GIL); Это делает такой код «как Threadsafe, как код Python», что не так много, но его легче обрабатывать, чем код полностью свободного нагрузки (вам все еще нужно архитектировать многопоточное сотрудничество и синхронизацию, в идеале с экземплярами очередей, но, возможно, с блокировка & c).
Код, который отказался от GIL и еще не приобрел его обратно, не должен каким-либо образом взаимодействовать со временем выполнения Python и объектами, которые использует время выполнения Python-это касается цинтона так же, как и для расширений C-кодирования. Прай, конечно, заключается в том, что такой код может работать на отдельном ядре (до тех пор, пока он не должен синхронизировать или каким -либо образом не общаться со временем выполнения Python, конечно).
Другие советы
Глобальная блокировка интерпретатора Python означает, что только один поток может быть активен в интерпретаторе в любое время. Однако после того, как управление будет передано в расширение C, другой поток может быть активным внутри интерпретатора. Можно создать несколько потоков, и ничто не предотвращает прерывание потока в середине критического раздела. Не
На защищенном потоке код может быть реализован в интерпретаторе, поэтому ничто в коде, работающем в интерпретаторе, не безопасно. Код в модулях C или Pyrex все еще может изменять структуры данных, которые видны коду Python. Настоящий код может, конечно, также иметь проблемы с потоком с нативными структурами данных.
Вы не можете гарантировать безопасность потока помимо использования соответствующего дизайна и синхронизации - GIL на интерпретаторе Python не существует существенно меняет.