Python多处理池类的意外行为



我正试图利用Python的多处理库,使用我在创建的Linux虚拟机上的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,都很难得到两个耗时相同的执行。

相关内容

  • 没有找到相关文章

最新更新