Я пытаюсь вызвать состояние гонки в демонстрационных целях, но безуспешно.Python

Программы на Python
Ответить
Anonymous
 Я пытаюсь вызвать состояние гонки в демонстрационных целях, но безуспешно.

Сообщение Anonymous »

Я активно пытаюсь получить состояние гонки и вызвать проблемы при расчетах в демонстрационных целях, но я не могу просто решить такую ​​проблему.
Моей задачей было создать переменную-счетчик, доберитесь до него из разных потоков и асинхронных функций (я не пробовал mp, так как он приостанавливает процесс) и увеличьте его на единицу.
Запуск 3 экземпляров циклов for в диапазоне x и увеличение счетчика на 1 в каждом цикле, я ожидал получить меньшее значение затем 3x из-за состояния гонки.
Я не использовал блокировки, но все равно получаю 3x значение при каждом запуске. Это связано с обновлением GIL? я пробовал использовать версии Python 3.10/3.11/3.13. Что мне следует сделать, чтобы получить простую структуру состояния гонки
мой код для получения состояния гонки
import threading
import asyncio

def multithreading_race_condition():
counter2 = 0

def increment():
nonlocal counter2
for _ in range(10000):
counter2 = counter2 + 1

threads = [threading.Thread(target=increment) for _ in range(3)]

for t in threads:
t.start()

for t in threads:
t.join()

print(f"Multithreading Final Counter: {counter2}")

async def asyncio_race_condition():
counter3 = 0

async def increment():
nonlocal counter3
for _ in range(10000):
counter3 = counter3 + 1

tasks = [asyncio.create_task(increment()) for _ in range(3)]

await asyncio.gather(*tasks)

print(f"Asyncio Final Counter: {counter3}")

def main():
print("\nMultithreading Example:")
multithreading_race_condition()

print("\nAsyncio Example:")
asyncio.run(asyncio_race_condition())

if __name__ == "__main__":
main()

мой результат:
Multithreading Example:
Multithreading Final Counter: 30000

Asyncio Example:
Asyncio Final Counter: 30000


Подробнее здесь: https://stackoverflow.com/questions/793 ... il-to-fail
Ответить

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

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

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

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

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