Python多处理/线程比虚拟机上的单处理需要更长的时间

标签 python multithreading multiprocessing python-multithreading python-multiprocessing

我在公司大型机上的虚拟机上工作。

我分配了 4 个核心来工作,所以我正在尝试并行处理我的 Python 代码。我还不熟悉它,我遇到了非常意外的行为,即多处理/线程比单处理需要更长的时间。我不知道是我做错了什么,还是我的虚拟机出了问题。

这是一个例子:

import multiprocessing as mg
import threading
import math
import random
import time

NUM = 4

def benchmark():
  for i in range(1000000):
    math.exp(random.random())

threads = []
random.seed()

print "Linear Processing:"
time0 = time.time()
for i in range(NUM):
  benchmark()
print time.time()-time0

print "Threading:"
for P in range(NUM):
  threads.append(threading.Thread(target=benchmark))
time0 = time.time()
for t in threads:
  t.start()
for t in threads:
  t.join()
print time.time()-time0

threads = []
print "Multiprocessing:"
for i in range(NUM):
  threads.append(mg.Process(target=benchmark))
time0 = time.time()
for t in threads:
  t.start()
for t in threads:
  t.join()
print time.time()-time0

结果是这样的:

Linear Processing:
1.125
Threading:
4.56699991226
Multiprocessing:
3.79200005531

线性处理在这里是最快的,这与我想要和期望的相反。 我不确定应该如何执行连接语句,所以我也用这样的连接做了这个例子:

for t in threads:
  t.start()
  t.join()

现在这会导致这样的输出:

Linear Processing:
1.11500000954
Threading:
1.15300011635
Multiprocessing:
9.58800005913

现在线程几乎和单处理一样快,而多处理甚至更慢。

在任务管理器中观察处理器负载时,即使在进行多处理时,四个虚拟内核的单个负载也不会超过 30%,所以我怀疑这里存在配置问题。

我想知道我是否正确地进行了基准测试,以及该行为是否真的像我认为的那样奇怪。

最佳答案

所以,首先,你没有做错任何事,当我在我的 Macbook Pro 上运行你的示例时,使用 cPython 2.7.12,我得到:

$ python test.py
Linear Processing:
0.733351945877
Threading:
1.20692706108
Multiprocessing:
0.256340026855

然而,当我改变时,差异变得更加明显:

for i in range(1000000):

收件人:

for i in range(100000000):

差异更加明显:

Linear Processing:
77.5861060619
Threading:
153.572453976
Multiprocessing:
33.5992660522

现在为什么线程总是变慢?因为全局解释器锁。 threading 模块唯一有用的地方就是等待 I/O。您的 multiprocessing 示例是执行此操作的正确方法。

因此,在您的原始示例中,线性处理 是最快的,我将此归咎于启动进程的开销。当你做少量工作时,通常情况下启动 4 个进程并等待它们完成比在单个进程中同步完成工作要花费更多时间。使用更大的工作负载来更真实地进行基准测试。

关于Python多处理/线程比虚拟机上的单处理需要更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38786312/

相关文章:

python multiprocessing,管理器启动进程生成循环

javascript - 如何删除ajax响应函数中的li元素

multithreading - 使用PHP CLI SAPI的基于PHP的服务器

c++ - qml c++ 多线程属性绑定(bind)

python - 类型错误 : 'MapResult' object is not iterable using pathos. 多处理

python - 了解 multiprocessing 模块的 cpu 核心的使用

python - 在 python 中调用 java 时,输出进入 stderr

python - 用于文件操作的 R 或 Python

python - 使用掩码创建彩色背景 - 在掩码为真的情况下无法分配 3 个输入值的错误

c++ - 为什么 boost::thread 的析构函数分离可连接线程而不是像标准建议的那样调用 terminate()?