Python 多处理:所有进程在 5 秒内完成,但程序需要额外 10 秒才能返回读取主脚本

Posted

技术标签:

【中文标题】Python 多处理:所有进程在 5 秒内完成,但程序需要额外 10 秒才能返回读取主脚本【英文标题】:Python multiprocessing: all processes finish in 5 seconds but 10 additional seconds needed for the program to return to reading the main script 【发布时间】:2020-07-24 07:22:24 【问题描述】:

我最近开始学习 Python 多处理。 每次,在所有进程完成后,python 都需要额外的一秒来关闭一个进程(所以如果我有 10 个打开,则需要 10 秒)并返回到脚本的其余部分。所以问题是一个简单的 .sleep() 程序使用多处理比运行一个正常的线性程序需要更多的时间。 代码:

def do_stuff(seconds):
    print("Sleeping for  seconds...".format(seconds))
    time.sleep(seconds)
    print("Done sleeping... yawn...")



if __name__ == "__main__":
    start = time.perf_counter()

    process_list = []
    for _ in range(10):
        p = multiprocessing.Process(target=do_stuff, args=[5])
        p.start()
        process_list.append(p)

    for process in process_list:
        process.join()


    end = time.perf_counter()
    print(end-start)

输出如下:

Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...

到目前为止,程序大约需要 5 秒才能完成所有 10 个进程

15.2574748

然后它又等待 10 秒来完成代码并返回程序完成所需的时间 我该如何解决这个问题?谢谢。

【问题讨论】:

我无法重现您的问题。使用您的代码,我得到5.6591163,我想这是您期望的时间 对我来说也一样。我得到5.3003993000000005。您使用的是什么操作系统和硬件? 我在 Windows 10 上用 cmd 运行它。 Python 3.8.2。 【参考方案1】:

您的代码看起来不错。但是,如果它不适用于您的操作系统,您可以尝试定义您希望同时运行的最大线程数。在以下示例中,它设置为 10。

import time
import multiprocessing

def do_stuff(seconds):
    print("Sleeping for  seconds...".format(seconds))
    time.sleep(seconds)
    print("Done sleeping... yawn...")

def chunks(l, n):
    for i in range(0, len(l), n):
        yield l[i:i + n]    

numberOfThreads = 10

if __name__ == "__main__":
    start = time.perf_counter()

    process_list = []
    for _ in range(10):
        p = multiprocessing.Process(target=do_stuff, args=[5])
        process_list.append(p)

    for i in chunks(process_list,numberOfThreads):
        for j in i:
            j.start()
        for j in i:
            j.join()


    end = time.perf_counter()
    print(end-start)

结果:

Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Sleeping for 5 seconds...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
Done sleeping... yawn...
5.6765913999999995

【讨论】:

以上是关于Python 多处理:所有进程在 5 秒内完成,但程序需要额外 10 秒才能返回读取主脚本的主要内容,如果未能解决你的问题,请参考以下文章

Python多处理池:完成任何k个作业后终止进程

Python多处理:向所有进程发出事件信号的最快方法?

python多进程-----multiprocessing包

python多处理子进程未正常退出

执行相同的过程N次,如果在X秒内没有完成,则终止它

如何在多处理完成之前存储所有输出?