Запуск нескольких функций в одном потоке в заданном порядке c - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть три функции, которые выполняют 3 разных блокнота jupyter с использованием papermill, и я хочу, чтобы первая (job1) и вторая (job2) функции выполнялись одновременно, а последняя функция (job3) запускалась только после того, как первая функция (job1) имеет закончил работу без ошибок. Я не уверен, имеет ли смысл создавать новый поток для второй функции или как правильно использовать метод join (). Я работаю на Windows и по какой-то причине concurrent.futures и многопроцессорная обработка не работают, поэтому я использую модуль потоков.

def job1():

    return pm.execute_notebook('notebook1.ipynb',log_output=False)

def job2():

     return pm.execute_notebook('notebook2.ipynb',log_output=False)

def job3():

     return pm.execute_notebook('notebook3.ipynb',log_output=False)


t1 = threading.Thread(target = job1)
t2 = threading.Thread(target = job2)
t3 = threading.Thread(target = job3)


try:
   t1.start()
   t1.join()
   t2.start()

except:
   pass

finally:

   t3.start()

1 Ответ

0 голосов
/ 23 апреля 2020

Мне нравится начинать с визуализации желаемого потока, который, как я понимаю, выглядит следующим образом:

enter image description here

Это означает, что t1 и t2 должны начать одновременно, а затем вам нужно присоединиться к обоим:

   t1.start() # <- Started 
   t2.start() # <- Started
   # t1 and t2 executing concurrently

   t1.join()
   t2.join()
   # wait for both to finish

   t3.start()
   t3.join()

Порядок соединения t1, t2 не очень важен, так как ваша программа все равно должна ожидать самого длинного потока. Если t1 заканчивается первым, он блокируется в t2, если t2 заканчивается первым, ему все еще нужно ждать t1, а затем произойдет «no-op» в t2.join ().

...