[英]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.Pool
的apply
函數只是在一個單獨的進程中運行一個函數,並等待其結果。 與順序運行相比,它花費更多的時間,因為它需要打包要處理的作業,並通過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.