我正在尝试利用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
答案 0 :(得分:2)
apply
的{{1}}函数只是在一个单独的进程中运行一个函数,并等待其结果。与顺序运行相比,它花费了更多时间,因为它需要打包要处理的作业,并通过multiprocessing.Pool
将其运送到子进程中。
pipe
并不能使顺序操作更快,它只是允许您在硬件具有多个核心的情况下并行运行它们。
只需尝试一下:
multiprocessing
您将看到似乎同时访问了4个URL。这意味着您的逻辑将访问N个网站到N / urls = ["http://google.com",
"http://example.com",
"http://stackoverflow.com",
"http://python.org"]
results = pool.map(stress_test_url, urls)
所需的时间减少了。
最后,由于网络不可靠,对执行HTTP请求的功能进行基准测试是衡量性能的一种非常差的方法。无论是否使用processes
,几乎都不会花费两个时间来执行两次执行。