Я пытаюсь разрешить спор с коллегой. Скажем, что у меня есть приложение Python 2.6, которое использует psycopg2
для связи с базой данных Postgres. Приложение многопоточно. Когда поток вызывает вызов базы данных с использованием psycopg2
, он освобождает GIL, чтобы другие потоки также могли вызвать вызов базы данных?«psycopg2` в Python 2.x блокирует GIL
ответ
С кратким взглядом на the Psycopg release notes есть много ссылок на выпуск GIL. Поэтому, по-видимому, он пытается освободить GIL, когда это уместно. Вы не спрашивали о конкретном сценарии, поэтому я не думаю, что более конкретный ответ возможен.
«Конкретный сценарий» Скажите только самую обычную операцию с базой данных, выбрав материал из таблицы? –
Как вы сказали, существует правило, что только поток, который приобрел GIL, может работать с объектами Python или вызывать функции API Python/C. Чтобы эмулировать параллелизм выполнения, интерпретатор Python регулярно пытается переключать потоки. Блокировка также освобождается вокруг потенциально блокирующих операций ввода-вывода, таких как чтение или запись файла, так что другие потоки Python могут работать в то же время.
Большинство кода расширения (код psycopg2 включены) манипулирования GIL имеет следующую простую структуру:
Save the thread state in a local variable.
Release the global interpreter lock.
... Do some blocking I/O operation ...
Reacquire the global interpreter lock.
Restore the thread state from the local variable.
Это означает, что, когда блокирующий операции ввода/вывода (ожидание ответа сети от Postgres, например) происходит , GIL освобождается, а другие потоки могут продолжать их выполнение. Когда операция блокировки ввода-вывода завершается, поток пытается получить GIL и продолжает выполнение (обработка результатов и т. Д.), Когда он, наконец, его приобретет.
Взгляните на реализацию psycopg2 here.
Try [в поисках 'Py_BEGIN_ALLOW_THREADS' или' PyEval_Save_Thread'] (https://github.com/psycopg/psycopg2/search?utf8=%E2%9C%93&q=py_begin_allow_threads+OR+pyeval_save_thread&type=Code) в источнике , Они посыпаются здесь и там, проверьте, применяется ли ваш конкретный сценарий. –