Неожиданное поведение потоков Python. СостояниеPython

Программы на Python
Ответить
Anonymous
 Неожиданное поведение потоков Python. Состояние

Сообщение Anonymous »

Я пытаюсь синхронизировать несколько потоков. Я ожидаю, что вывод сценария при использовании threading.Condition и threading.Barrier будет примерно одинаковым, но это не так. Пожалуйста, объясните, почему это происходит.
В общем, мне нужны потоки для выполнения работы (некоторые операции ввода-вывода) в бесконечном цикле, но каждый цикл начинается с разрешение главного потока, а разрешение дается только после завершения предыдущего цикла всеми потоками.
скрипт 1

Код: Выделить всё

from threading import Barrier, Thread
from time import sleep, time

br = Barrier(3)
store = []

def f1():
while True:
br.wait()
sleep(1)
print("Calc part1")

def f2():
while True:
br.wait()
sleep(1)
print("Calc part2")

Thread(target=f1).start()
Thread(target=f2).start()

for i in range(10):
br.wait()
print(f'end iter {i}')
print(f'-------------')
ожидаемое поведение

Код: Выделить всё

ent iter 0
-------------
Calc part1
Calc part2
ent iter 1
-------------
Calc part2
Calc part1
ent iter 2
-------------
Calc part1
...
сценарий 2

Код: Выделить всё

from threading import Condition, Thread
from time import sleep

condition = False
cv = Condition()

def predicate():
return condition

def f1():
for i in range(3):
with cv:
cv.wait_for(predicate)
sleep(1)
print("Calc part1")

def f2():
for i in range(3):
with cv:
cv.wait_for(predicate)
sleep(1)
print("Calc part2")

Thread(target=f1).start()
Thread(target=f2).start()

with cv:
condition = True
cv.notify_all()
неожиданное поведение

Код: Выделить всё

Calc part1
Calc part1
Calc part1
Calc part2
Calc part2
Calc part2
Почему стандартный вывод потоков не смешивается в результате второго скрипта?

Подробнее здесь: https://stackoverflow.com/questions/787 ... -condition
Ответить

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

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

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

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

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