Python 以特定顺序在同一线程中运行多个函数

Python 以特定顺序在同一线程中运行多个函数,python,concurrency,jupyter-notebook,python-multithreading,papermill,Python,Concurrency,Jupyter Notebook,Python Multithreading,Papermill,我有三个函数使用造纸机执行3个不同的jupyter笔记本,我希望第一个(job1)和第二个(job2)函数同时运行,最后一个函数(job3)只在第一个函数(job1)完成运行后运行,不会出现任何错误。我不确定为第二个函数创建新线程是否有意义,或者如何正确使用join()方法。 我在Windows上运行,出于某种原因,concurrent.futures和multiprocessing不起作用,这就是我使用线程模块的原因 def job1(): return pm.execute_not

我有三个函数使用造纸机执行3个不同的jupyter笔记本,我希望第一个(job1)和第二个(job2)函数同时运行,最后一个函数(job3)只在第一个函数(job1)完成运行后运行,不会出现任何错误。我不确定为第二个函数创建新线程是否有意义,或者如何正确使用join()方法。 我在Windows上运行,出于某种原因,concurrent.futures和multiprocessing不起作用,这就是我使用线程模块的原因

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()

我喜欢从可视化所需的流开始,我理解为:

这意味着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.start()

这意味着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.start()#我编写了一个并行运行DAG的程序,这正是您所需要的。这是作为开源项目的一部分完成的。解决方案使用进程而不是线程,但您可以调整它。其基本思想是拥有一个进程池并跟踪每个任务的状态,无论何时任何任务完成,都会发送下一个任务。顺序是通过在中迭代DAG来确定的

如果任何任务失败,它们的所有下游依赖项都将中止。程序将继续运行,直到没有更多任务要运行,代码如下:


我看到您正在尝试在Paperill中运行笔记本,我开发的工具正好支持这一点:它可以运行任意复杂的管道(任务可以参数化Jupyter笔记本)。对于您的用例来说,这似乎是一个不错的选择:

我编写了一个并行运行DAG的程序,这正是您所需要的。这是作为开源项目的一部分完成的。解决方案使用进程而不是线程,但您可以调整它。其基本思想是拥有一个进程池并跟踪每个任务的状态,无论何时任何任务完成,都会发送下一个任务。顺序是通过在中迭代DAG来确定的

如果任何任务失败,它们的所有下游依赖项都将中止。程序将继续运行,直到没有更多任务要运行,代码如下:


我看到您正在尝试在Paperill中运行笔记本,我开发的工具正好支持这一点:它可以运行任意复杂的管道(任务可以参数化Jupyter笔记本)。对于您的用例来说,这似乎是一个不错的选择:

您好,谢谢您的回答,只有一个问题,如果t1出现错误并且无法成功运行,会发生什么?是否有任何类型的异常子句可以插入,以便t3仅在t1成功时运行?您好,谢谢您的回答,只有一个问题,如果t1出现错误并且无法成功运行,会发生什么情况?是否有任何类型的例外条款可以插入,使t3只在t1成功时运行?嗨,哇,这看起来很棒!我希望能够用它来制作我的笔记本。多处理和并发未来模块在我的机器上不起作用(根据我的研究,这是因为windows和jupyter的结合导致了pickle和GIL的问题)。我已经求助于使用joblib,它非常有效。你有什么例子吗?我不知道如何在不修改源代码的情况下用threadpoolexecutor替换ProcessPoolExecutor。我没有看到基于线程执行的情况,但现在我认为它可能有用。密切关注回购协议,我会处理这个soonHi,哇,看起来很棒!我希望能够用它来制作我的笔记本。多处理和并发未来模块在我的机器上不起作用(根据我的研究,这是因为windows和jupyter的结合导致了pickle和GIL的问题)。我已经求助于使用joblib,它非常有效。你有什么例子吗?我不知道如何在不修改源代码的情况下用threadpoolexecutor替换ProcessPoolExecutor。我没有看到基于线程执行的情况,但现在我认为它可能有用。密切关注回购协议,我很快就会处理的