【问题标题】:Python multiprocessing module not calling functionPython多处理模块不调用函数
【发布时间】:2018-01-14 00:09:14
【问题描述】:

我有一个程序需要创建多个图表,每个图表通常需要几个小时。因此,我想在不同的内核上同时运行这些,但似乎无法让这些进程与 multiprocessing 模块一起运行。这是我的代码:

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=full_graph)
        jobs.append(p)
        p.start()
        p.join()

full_graph()在程序前面已经定义好了,只是一个运行其他函数集合的函数)

该函数通常会输出一些图形,并将数据保存到 .txt 文件中。所有数据都保存到相同的 2 个文本文件中。但是,使用上面的代码调用函数不会提供控制台输出,也不会向文本文件提供任何输出。所发生的只是几秒钟的长时间暂停,然后程序退出。

我正在使用带有 WinPython 3.6.3 的 Spyder IDE

【问题讨论】:

    标签: python python-3.6 python-multiprocessing


    【解决方案1】:

    如果没有简单的full_graph 示例,没有人可以告诉您发生了什么。但是你的代码本质上是错误的。

    if __name__ == '__main__':
        jobs = []
        for i in range(5):
            p = multiprocessing.Process(target=full_graph)
            jobs.append(p)
            p.start()
            p.join()  # <- This would block until p is done
    

    查看p.join()之后的评论。如果您的流程确实需要几个小时才能完成,您将运行一个流程几个小时,然后运行第二个、第三个。串行并使用单核。

    来自文档:https://docs.python.org/3/library/multiprocessing.html

    Process.join:https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Process.join

    如果可选参数 timeout 为 None(默认值),则该方法会阻塞,直到调用 join() 方法的进程终止。如果 timeout 是一个正数,它最多会阻塞 timeout 秒。请注意,如果该方法的进程终止或该方法超时,则该方法返回 None。检查进程的退出代码以确定它是否终止。

    如果每个进程执行不同的操作,那么您还应该有一些 args 用于 full_graph提示:这可能是缺少的因素吗?)

    您可能想使用Pool 中的map 之类的接口

    然后做(再次来自文档)

    from multiprocessing import Pool
    
    def f(x):
        return x*x
    
    if __name__ == '__main__':
        with Pool(5) as p:
            print(p.map(f, [1, 2, 3]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多