簡體   English   中英

Python多處理池類的意外行為

[英]Unexpected Behavior from Python Multiprocessing Pool Class

我正在嘗試利用Python的多處理庫使用我在創建的Linux VM上擁有的8個處理核心來快速運行函數。 作為測試,我得到了具有4個進程的工作池運行一個功能所花費的時間,以及不使用工作池運行相同功能所花費的時間。 以秒為單位的時間幾乎是相同的,在某些情況下,處理工人池要比不使用工人池花費更多的時間。

腳本

import requests
import datetime
import multiprocessing as mp

shared_results = []

def stress_test_url(url):
    print('Starting Stress Test')
    count = 0

    while count <= 200:
        response = requests.get(url)
        shared_results.append(response.status_code)
        count += 1

pool = mp.Pool(processes=4)

now = datetime.datetime.now()
results = pool.apply(stress_test_url, args=(url,))
diff = (datetime.datetime.now() - now).total_seconds()

now = datetime.datetime.now()
results = stress_test_url(url)
diff2 = (datetime.datetime.now() - now).total_seconds()

print(diff)
print(diff2)

終端輸出

Starting Stress Test
Starting Stress Test
44.316212
41.874116

multiprocessing.Poolapply函數只是在一個單獨的進程中運行一個函數,並等待其結果。 與順序運行相比,它花費更多的時間,因為它需要打包要處理的作業,並通過pipe將其運送到子進程。

multiprocessing並不能使順序操作更快,它只是允許您在硬件具有多個核心的情況下並行運行它們。

嘗試一下:

urls = ["http://google.com", 
        "http://example.com", 
        "http://stackoverflow.com", 
        "http://python.org"]

results = pool.map(stress_test_url, urls)

您會看到似乎同時訪問了這4個URL。 這意味着您的邏輯減少了訪問N個網站訪問N /個processes所需的時間。

最后,由於網絡不可靠,對執行HTTP請求的功能進行基准測試是衡量性能的一種非常差的方法。 無論是否使用multiprocessing幾乎都不會花費兩個時間來執行兩個執行。

暫無
暫無

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

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