Как синхронизировать два непрерывно работающих потоков, используя событие? - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь запустить несколько строк в thread1 в соответствии с событием из thread2. Оба потока постоянно работают в цикле "True". Проблема в том, что я не могу запустить требуемые строки ТОЛЬКО в случае возникновения события.

Кстати, оба потока используют общий ресурс (список) и могут быть синхронизированы с помощью метода блокировки. Это также не сработало для меня.

frames_list = []
new_frame = Event()
result = 0


def thr1():
    global frames_list
    global frames_list_max_size
    global result
    while True:
        new_frame.set()
        result = result + 1
        new_frame.clear()


def thr2():
    global result
    while True:
        new_frame.wait()
        print(datetime.datetime.now())
        print(result)


threads = []
for func in [thr1, thr2]:
    threads.append(Thread(target=func))
    threads[-1].start()

for thread in threads:
    thread.join()

результат, например:

2019-10-19 22:35:34.150852
1710538
2019-10-19 22:35:34.173803
1722442
2019-10-19 22:35:34.197736
1737844
2019-10-19 22:35:34.214684
1740218
2019-10-19 22:35:34.220664
1749776

Я ожидаю: 1. Разница во времени между каждым отпечатком будет 1 сек. 2. результат будет увеличиваться на 1 для каждого отпечатка.

1 Ответ

0 голосов
/ 19 октября 2019

Вы не можете решить эту проблему, используя один Event объект, но вы можете сделать это, используя два Event объекта:

  1. Один, чтобы уведомить об изменении переменной result.
  2. Один для уведомления о том, что было использовано новое значение переменной result.

Модифицированный код:

import time

frames_list = []
new_frame = Event()
new_frame_consumed = Event()
result = 0


def thr1():
    global frames_list
    global frames_list_max_size
    global result
    while True:
        result = result + 1
        time.sleep(1)
        new_frame.set()
        new_frame_consumed.wait()
        new_frame_consumed.clear()


def thr2():
    global result
    while True:
        new_frame.wait()
        new_frame.clear()
        print(datetime.datetime.now())
        print(result)
        new_frame_consumed.set()


threads = []
for func in [thr1, thr2]:
    threads.append(Thread(target=func))
    threads[-1].start()

for thread in threads:
    thread.join()
...