簡體   English   中英

關於使用多處理模塊並發執行進程的問題

[英]Question regarding concurrent execution of processes using multiprocessing module

我最近正在使用 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()

下面是 output:

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.

為什么進程的開始時間不同? 這不違反並行的定義嗎?

為了補充@chepner 所說的內容,您將在for循環中一次啟動一個進程,因此它們將按順序啟動。 這與說它們沒有並行運行不同。

事實上,它們並行執行的,因為進程的結束順序與它們啟動時的順序不同。 如果它們是按順序執行的,它們也將以您啟動它們的順序結束。

相反,這些過程完全按照它們的延遲量結束。 進程 0 有 1 秒的延遲,所以它首先結束。 進程 3 有 2 秒的延遲,秒結束。 進程 2 有 3 秒的延遲,第三個結束。 最后,進程 1 有 4 秒的延遲,第四個結束。 這表明它們實際上是並行運行的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM