Пользователь подсказывает с многопоточностью - PullRequest
0 голосов
/ 22 января 2020

У меня одновременно запущено несколько потоков, которые работают в «фоновом режиме», но затем программа достигает точки, где для продолжения всех потоков требуется ввод данных пользователем. Ниже написано то, что я написал, и оно работает, но оно кажется неэффективным, и я не уверен, как еще это сделать, поскольку это мой первый опыт работы с многопоточностью.

global userPromptFlag = 1

        # first thread to reach this condition prompts the user for info
        if (userPromptFlag == 1):
            userPromptFlag = 0
            self.userPrompts()
        else:
            # other threads wait until user finishes entering prompts
            while promptsFinished == 'n':
                pass

Не знаю как тот факт, что существует небольшая вероятность того, что два потока могут достичь состояния одновременно, хотя это не происходило еще во многих моих тестах. Я также не фанат других тем, которые сидят в этом, пока l oop ждет, пока пользователь введет требуемую информацию, но нам пока не нужно беспокоиться об этом (если только вы не захотите обратиться к ней в качестве бонуса). вопрос: D)

1 Ответ

1 голос
/ 22 января 2020

Используйте событие как барьер. Первый поток очистит событие, а другие будут ждать, пока оно не будет установлено снова.

import threading
prompt_lock = threading.Lock()
prompt_event = threading.Event()
prompt_event.set()

        # first thread to reach here prompts the user for info
        first = False
        with prompt_lock:
            if prompt_event.is_set():
               prompt_event.clear()
               first = True

        if first:
            try:
                self.userPrompts()
            finally:
                prompt_event.set()
        else:
            prompt_event.wait()
...