Является ли язык 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, и вы должны предположить, что операция не является поточно-ориентированной.