Является ли язык Python "in" конструкцией потока безопасна для списков?

Является obj in a_list потокобезопасный в то время как a_list может быть изменен в другом потоке?

Вот полный, но не исчерпывающий список примеров list операции и являются ли они потокобезопасными, однако я не смог найти ссылку на in языковая конструкция.

С точки зрения реализации Python, я использую CPython, но ответы о других реализациях также будут полезны для сообщества.

1 ответ

Решение

Я предполагаю, что вы используете CPython здесь.

При условии, что нет пользовательских __contains__ или же __iter__ возвращение обратно в Python или значения, которые вы проверяете, содержащиеся в списке, используют пользовательские __eq__ Хуки, реализованные в коде Python, in оператор может быть полностью обработан в C, и это всего лишь один код операции.

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

Тем не менее, если вы используете in для пользовательского типа C, который разблокирует GIL при тестировании содержимого, не будет поточно-ориентированным.

Другими словами: in Тестирование байт-кода заблокировано, но если оператору необходимо вызвать код Python (через __contains__итерируя с __iter__ когда нет __contains__ реализация доступна, или значения проверяются __eq__ в Python), то операция не является поточно-ориентированной.

Для других реализаций Python способ обработки потоков может сильно различаться. Конечно, у Jython и IronPython нет GIL, и вы должны предположить, что операция не является поточно-ориентированной.

Другие вопросы по тегам