Можно ли реализовать блокировку стека в Python? Я искал в Интернете и не нашел функцию CAS в Python.Блокировка свободной реализации стека в Python
ответ
Вы упомянули CAS и атомные операции в конкретном, но стандартная реализация Python (CPython) работает с байтовым кодом и использует также так называемый глобальный блокиратор интерпретатора. Итак, вот некоторые соображения, почему есть no атомных операций в Python и почему это не нужно.
Глобальный Переводчик Лок (GIL)
В CPython, глобальная блокировка интерпретатора, или GIL, является мьютекс, что предотвращает множественные собственные потоки от выполнения байт-код Python в раз.
Это означает, что только один нить в то время, на самом деле может выполнить Python. Когда несколько потоков работают, они вращаются при их выполнении. Темы могут освобождать gil только между инструкциями байткода - так не в середине выполненной инструкции. Каждая инструкция уже «атомарна» с точки зрения программы Python. Но не смешивайте это с аппаратными атомными операциями на процессоре, это уровень глубже. За каждой инструкцией байткода есть несколько команд ассемблера, которые выполняются.
Атомные операции необходимы только в том случае, если вы хотите избежать того, что операция, подобная функции сравнения и переключения, не прерывается никаким другим потоком. Это не может произойти в Python. Поток может прерывать другой поток между выполнением инструкций для создания сравнения и переключателя, а затем вместо этого вы должны использовать поток.
Простая блокировка необходима, если вы хотите гарантировать, что последовательность команд байтового кода или вызовы функций Python выполняется без прерывания другого потока.
Давайте посмотрим на какой-то исходный код и соответствующие инструкции байткодом:
a = 0
b = 0
def func():
global a
global b
# The const value 100 is loaded and stored in 'a'
a = 100
# 0 LOAD_CONST 1 (100)
# 3 STORE_GLOBAL 0 (a)
# The const value 200 is loaded and stored in 'b'
b = 200
# 6 LOAD_CONST 1 (200)
# 9 STORE_GLOBAL 0 (b)
Функция перезаписывает глобальные переменные a
и b
со значениями 100 и 200. Если бы выполнить func
из двух потоков, мы можем быть уверены, что значения a
и b
всегда будут действительны, поскольку потоки могут просто переключаться между инструкциями байткода. Если бы мы записали эту функцию в C, то a
и b
были бы атомными целыми числами.
Для меня это collections.deque это класс, который вы ищете. Это потокобезопасный стек, который гарантирует, что append или pop выполняется без прерывания. Deques также поддерживает эффективные приложения и всплывающие подсказки.
- 1. Хорошо протестированная C/C++ блокировка свободной очереди?
- 2. Блокировка свободной хеш-таблицы для C#
- 3. Реализации стека в C
- 4. EXC_BAD_ACCESS в реализации стека
- 5. Простая блокировка стека C++ 11
- 6. C++ как сделать блокировку свободной стека атома
- 7. сборки реализации x86 стека
- 8. Ошибка реализации ошибочного стека
- 9. ключ API для свободной реализации Spotify клиента
- 10. NullPointerException в реализации стека ArrayDeque
- 11. Блокировка свободной памяти в C++ для переменной длины Записи
- 12. Блокировка свободного стека и очереди в C#
- 13. MVC: Реализации стека сообщений пользователя
- 14. Сложность реализации динамического массива стека
- 15. Понимание реализации массива стека (C)
- 16. Блокировка файлов в Python?
- 17. Блокировка dict в Python?
- 18. Блокировка потоков в Python
- 19. Отслеживание размера стека в связанном списке реализации стека C++
- 20. Является ли эта блокировка свободной конструкционной резьбой безопасной?
- 21. Блокировка свободной кольцевой кольцевой очереди не работает должным образом
- 22. Действительно ли блокировка стека требует блокировок?
- 23. свободной памяти в многоступенчатом изображение в Python
- 24. Перегрузка оператора == в пользовательской реализации стека
- 25. Исключение нулевого указателя в реализации стека
- 26. Ошибка при реализации стека в c
- 27. Связанный список реализации стека в C++
- 28. Использование стека программ в реализации DFS
- 29. Двойные указатели в реализации стека связанного списка
- 30. c - Утечка данных в моей реализации стека
Спасибо @HelloWorld. Это здорово, но делает ** deque ** поддерживает CAS (сравнить и переключать) атомную работу? Это необходимо для обеспечения незакрепленной реализации стека. –
Прочтите мой ответ еще раз. Python не работает так. В этом нет необходимости, и нет атомных операций. Вам нужно атомизировать, когда ваша среда поддерживает реальную многопоточность, это не так в CPython. Когда Python выполняет инструкцию байт-кода, он говорит «записывать x в y», тогда ** no ** другой поток может прерывать или делать что-либо еще в то же время. Вы можете быть уверены, что инструкция полностью выполняется, когда поток возвращается из выполнения этой инструкции.Когда вам нужна функция, которая делает сравнение и переключатель, вы должны использовать блокировку, - но опять же, это не атомный. – HelloWorld