Python多处理池类的意外行为

时间:2018-07-18 18:56:43

标签: python linux multiprocessing pool

我正在尝试利用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

1 个答案:

答案 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,几乎都不会花费两个时间来执行两次执行。