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

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

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

24
задан philo 23 August 2010 в 16:57
поделиться

1 ответ

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

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

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

21
ответ дан 29 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: