Подтвердить что ты не робот

Python threading: модель памяти и видимость

Потоки python раскрывают проблемы видимости памяти и переупорядочения операторов, как это делает Java? Поскольку я не могу найти ссылку на "модель памяти Python" или что-то в этом роде, несмотря на то, что многие люди пишут многопоточный код Python, я предполагаю, что этих ошибок нет здесь. Например, ключевое слово volatile отсутствует. Но, похоже, это явно не указано нигде, что, например, изменение переменной в одном потоке сразу видимо для всех других потоков.

Возможно, этот материал очень очевиден для программистов на Python, но, как страшный программист на Java, мне нужно немного дополнительного успокоения:)

4b9b3361

Ответ 1

Нет никакой официальной модели для потоковой обработки Python (эй, в конце концов, для Java не было ни одного года... надеюсь, что в конце концов будет написано и для Python).

На практике никакая реализация Python не выполняет какую-либо расширенную оптимизацию, такую ​​как переупорядочение операторов или временное обращение к общим переменным как поточно-локальные, и вы можете рассчитывать на эти ограничения семантики, даже если они официально не гарантированы.

CPython, в частности, как упоминает @Rawheiser, использует глобальную блокировку интерпретатора; другие реализации (PyPy, IronPython, Jython,...) не позволяют (поэтому они могут эффективно использовать несколько ядер с моделью потоков, в то время как CPython требует многопроцессорной обработки для той же цели), поэтому вы не должны рассчитывать на это, если хотите для написания кода, который переносится во всех реализациях Python. (Таким образом, вы не должны рассчитывать на "атомарность" операций, которые только бывают атомарными в CPython из-за GIL, таких как доступ к словарю, - в других реализациях Python, несколько потоков могут одновременно модифицировать dict и вызывать ошибки, если вы не защитите dict с помощью блокировки или тому подобного).