关于使用多处理模块并发执行进程的问题

2024-10-05 13:15:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近正在学习使用Python进行多处理。我学到的是,我们使用Python中的多处理模块来实现并行性,这意味着进程同时执行。

但为什么下面的代码显示四个进程的启动时间相差几毫秒

from multiprocessing import Process
import os, time, datetime, random, tracemalloc

tracemalloc.start()
children = 4    # number of child processes to spawn
maxdelay = 6    # maximum delay in seconds

def status():
    return ('Time: ' + 
        str(datetime.datetime.now().time()) +
        '\t Malloc, Peak: ' +
        str(tracemalloc.get_traced_memory()))

def child(num):
    delay = random.randrange(maxdelay)
    print(f"{status()}\t\tProcess {num}, PID: {os.getpid()}, Delay: {delay} seconds...")
    time.sleep(delay)
    print(f"{status()}\t\tProcess {num}: Done.")

if __name__ == '__main__':
    print(f"Parent PID: {os.getpid()}")
    for i in range(children):
        proc = Process(target=child, args=(i,))
        proc.start()

以下是输出:

Parent PID: 16048
Time: 09:52:47.014906    Malloc, Peak: (228400, 240036)     Process 0, PID: 16051, Delay: 1 seconds...
Time: 09:52:47.016517    Malloc, Peak: (231240, 240036)     Process 1, PID: 16052, Delay: 4 seconds...
Time: 09:52:47.018786    Malloc, Peak: (231616, 240036)     Process 2, PID: 16053, Delay: 3 seconds...
Time: 09:52:47.019398    Malloc, Peak: (232264, 240036)     Process 3, PID: 16054, Delay: 2 seconds...

Time: 09:52:48.017104    Malloc, Peak: (228434, 240036)     Process 0: Done.
Time: 09:52:49.021636    Malloc, Peak: (232298, 240036)     Process 3: Done.
Time: 09:52:50.022087    Malloc, Peak: (231650, 240036)     Process 2: Done.
Time: 09:52:51.020856    Malloc, Peak: (231274, 240036)     Process 1: Done.

为什么过程的开始时间不同?这不是违背了并行性的定义吗


Tags: childdatetimetimeosstatusprocesspidseconds
1条回答
网友
1楼 · 发布于 2024-10-05 13:15:15

为了补充@chepner所说的,您在for循环中一次启动一个进程,因此它们将按顺序启动。这和说它们不是并行运行是两码事

事实上,它们是并行执行的,因为进程的结束顺序与启动顺序不同。如果它们是按顺序执行的,它们也会按照您启动它们的顺序结束

相反,进程的结束顺序与它们的延迟量完全一致。进程0的延迟为1秒,因此它首先结束。进程3的延迟为2秒,结束时间为2秒。进程2延迟3秒,第三次结束。最后,进程1延迟4秒,并以第四个结束。这表明它们实际上是并行运行的

相关问题 更多 >

    热门问题