如何使用多处理 python 顺序运行多个函数?

Posted

技术标签:

【中文标题】如何使用多处理 python 顺序运行多个函数?【英文标题】:How to run multiple functions sequentialy with multiprocessing python? 【发布时间】:2021-02-21 21:26:09 【问题描述】:

我正在尝试通过多处理运行多个功能,但遇到了一些困难。我想在所有进程/输入上运行一个初始函数以完成,然后在第一个函数的输出上并行运行 2 或 3 个其他函数。我已经有了我的搜索功能。代码是为了解释。

我不确定如何从这里继续代码。我把我最初的尝试放在下面。我希望 process1 的所有实例完成,然后 process2 和 process3 并行启动。

代码类似于:

from multiprocessing import Pool


def init(*args):
    global working_dir
    [working_dir] = args

def process1(InFile):
    python.DoStuffWith.InFile
    Output.save.in(working_dir)

def process2(queue):
    inputfiles2 = []
    python.searchfunction.appendOutputof.process1.to.inputfiles2
    python.DoStuffWith.process1.Output
    python.Output

def process3(queue):
    inputfiles2 = []
    python.searchfunction.appendOutputof.process1.to.inputfiles2
    python.DoStuffWith.process1.Output
    python.Output

def MCprocess():
    working_dir = input("enter input: ")
    inputfiles1 = []
    python.searchfunction.appendfilesin.working_dir.to.inputfiles1
    with Pool(initializer=init, initargs=[working_dir], processes=16) as pool:
        pool.map(process1, inputfiles1)
        pool.close()
    
    #Editted Code
    queue = multiprocessing.Queue
    queue.put(working_dir)
    queue.put(working_dir)
    ProcessTwo = multiprocessing.Process(target=process2, args=(queue,))
    ProcessThree = multiprocessing.Process(target=process3, args=(queue,))
    ProcessTwo.start()
    ProcessThree.start()
     #OLD CODE
     #with Pool(initializer=init, initargs=[working_dir], processes=16) as pool:
        #pool.map_async(process2)
        #pool.map_async(process3)
    


if __name__ == '__main__':
    MCprocess()

【问题讨论】:

顺便说一句,退出with 会关闭池,使用with 时不需要pool.close() 除了map_async 缺少第二个参数,这看起来还可以。有什么问题? 我正在做的过程不可迭代是问题所在。我不确定使用什么作为第二个参数。我在 process2 中运行的单个进程和在 process3 中运行的单个进程中使用 process1 的所有输出。我希望 process2 和 process3 同时运行,因为它们可能很长。 如果 process2 和 process3 都应该只在一个实例中运行,请使用“进程”而不是“池”。为这两个中的每一个创建一个“进程”,启动两个,然后加入两个(如果你想等到两个都终止)。它们将并行运行。 “init”的功能必须以某种方式集成在“processN”函数的开头。 @MichaelButscher 我已经更新了我的代码以使用 Process。但是现在我收到一条错误消息,说 working_dir 没有定义。如何将值传递给 process2/3 ?还是应该是一个单独的问题? 【参考方案1】:

您最好的选择是使用事件。第一个进程在完成时调用event.set() 以指示事件已经发生。等待进程使用event.wait() 或其变体之一等待事件已设置被唤醒。

【讨论】:

以上是关于如何使用多处理 python 顺序运行多个函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用多个参数运行相同函数的 Python 多处理

python多线程

Python多线程的理解和使用Threading中join()函数的理解

python多线程

python多线程

python-多线程:调用thread模块中的start_new_thread()函数来产生新线程