В свободном Python без GIL или других блокировок может ли изменение целочисленного поля объекта нарушить работу интерпреPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 В свободном Python без GIL или других блокировок может ли изменение целочисленного поля объекта нарушить работу интерпре

Сообщение Anonymous »

Начиная с версии CPython 3.13, глобальную блокировку интерпретатора теперь можно отключить.
При работе без 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 (с GIL или без него) я понимаю, что этот код, не использующий какой-либо явной блокировки, является нестандартным в этом выводе. (instance.counter) может наблюдать ненулевые значения, а значения могут расходиться с течением времени. Меня это устраивает.
Однако мне любопытно, делает ли Python 3.13+ со свободным потоком этот код безопасным. В частности:
  • Могут ли попытки доступа к экземпляру.counter или self.counter привести к сбою сегмента, сбою или повреждению состояния интерпретатора?< /li>
    Могут ли попытки увеличить или уменьшить счетчик экземпляра привести к сбою сегмента, сбою или повреждению состояния интерпретатора?
  • Могут ли извлечение и печать/копирование /storeing instance.counter когда-нибудь получал непредставимое или нецелое значение?
Я понимаю, что ответы на этот вопрос могут быть связаны с реализацией. специфичен и потенциально может быть изменен.
Меня конкретно, узко интересует изменение числовых полей в объектах на чистом Python, которые я полностью контролирую. Я понимаю, что наличие другого кода в промежуточных слоях контейнеров или логике доступа может привести к аннулированию любых гарантий безопасности, предоставляемых в данном конкретном случае.
Что я пробовалВыполнение приведенного выше кода отображает ожидаемые условия гонки в интерпретаторах с поддержкой и отключением GIL, которые я создал локально, но не приводит к сбою или выдаче нецелочисленных значений. Тем не менее, возможно, я не запускал его достаточно долго или в системе, которая вызывает определенные условия гонки внутри интерпретатора.
Чтение PEP для удаления GIL и вспомогательной документации для расширения C. разработчики не указывают какие-либо предоставленные инварианты поведения в отношении потокобезопасности, когда речь идет о чистом коде Python.
Я знаю, что были добавлены внутренние блокировки интерпретатора (которые замедляют однопоточную обработку) в переводчиках без GIL, чтобы предотвратить некоторые случаи государственной коррупции; Мне любопытно, используется ли такая блокировка в данном конкретном случае, и если да, то какие инварианты она обеспечивает в отношении безопасности при сбоях и наблюдения за недопустимыми промежуточными состояниями.
Я знаю, что явная блокировка необходима для многопоточной корректности при наличии изменяемых данных. Однако меня интересует не правильность, а скорее безопасность, как она определена выше.
Почему я спрашиваю
  • Любопытство.
  • Я сохраняю обеспокоенность по поводу безопасности уже существующего кода.
  • Интерес к использованию этого шаблона для реализации заведомо неточных изменяемых чисел для нечеткого тестирования. и приближение.


Подробнее здесь: https://stackoverflow.com/questions/790 ... an-integer
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»