При работе без GIL мне интересно, какие операции безопасны, где «безопасный» означает « не приводит к сбою или повреждению интерпретатора".
В частности, рассмотрим этот пример кода, который создает простой класс и увеличивает/уменьшает счетчик int для этого класса в параллельно:
Код: Выделить всё
import threading
import time
class MyObject:
def __init__(self):
self.counter = 0
def run(self):
while True:
self.counter += 1
self.counter -= 1
instance = MyObject()
for _ in range(10):
threading.Thread(target=instance.run).start()
while True:
print(instance.counter)
time.sleep(1)
Однако мне любопытно, делает ли Python 3.13+ со свободным потоком этот код безопасным. В частности:
- Могут ли попытки доступа к экземпляру.counter или self.counter привести к сбою сегмента, сбою или повреждению состояния интерпретатора?< /li>
Могут ли попытки увеличить или уменьшить счетчик экземпляра привести к сбою сегмента, сбою или повреждению состояния интерпретатора? - Могут ли извлечение и печать/копирование /storeing instance.counter когда-нибудь получал непредставимое или нецелое значение?
Меня конкретно, узко интересует изменение числовых полей в объектах на чистом Python, которые я полностью контролирую. Я понимаю, что наличие другого кода в промежуточных слоях контейнеров или логике доступа может привести к аннулированию любых гарантий безопасности, предоставляемых в данном конкретном случае.
Что я пробовалВыполнение приведенного выше кода отображает ожидаемые условия гонки в интерпретаторах с поддержкой и отключением GIL, которые я создал локально, но не приводит к сбою или выдаче нецелочисленных значений. Тем не менее, возможно, я не запускал его достаточно долго или в системе, которая вызывает определенные условия гонки внутри интерпретатора.
Чтение PEP для удаления GIL и вспомогательной документации для расширения C. разработчики не указывают какие-либо предоставленные инварианты поведения в отношении потокобезопасности, когда речь идет о чистом коде Python.
Я знаю, что были добавлены внутренние блокировки интерпретатора (которые замедляют однопоточную обработку) в переводчиках без GIL, чтобы предотвратить некоторые случаи государственной коррупции; Мне любопытно, используется ли такая блокировка в данном конкретном случае, и если да, то какие инварианты она обеспечивает в отношении безопасности при сбоях и наблюдения за недопустимыми промежуточными состояниями.
Я знаю, что явная блокировка необходима для многопоточной корректности при наличии изменяемых данных. Однако меня интересует не правильность, а скорее безопасность, как она определена выше.
Почему я спрашиваю
- Любопытство.
- Я сохраняю обеспокоенность по поводу безопасности уже существующего кода.
- Интерес к использованию этого шаблона для реализации заведомо неточных изменяемых чисел для нечеткого тестирования. и приближение.
Подробнее здесь: https://stackoverflow.com/questions/790 ... an-integer