【发布时间】:2015-10-15 00:05:39
【问题描述】:
我正在尝试掌握 Python 中的多处理。我从创建这段代码开始。它只计算整数 i 的 cos(i) 并测量使用多处理和不使用多处理所用的时间。我没有观察到任何时差。这是我的代码:
import multiprocessing
from multiprocessing import Pool
import numpy as np
import time
def tester(num):
return np.cos(num)
if __name__ == '__main__':
starttime1 = time.time()
pool_size = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=pool_size,
)
pool_outputs = pool.map(tester, range(5000000))
pool.close()
pool.join()
endtime1 = time.time()
timetaken = endtime1 - starttime1
starttime2 = time.time()
for i in range(5000000):
tester(i)
endtime2 = time.time()
timetaken2 = timetaken = endtime2 - starttime2
print( 'The time taken with multiple processes:', timetaken)
print( 'The time taken the usual way:', timetaken2)
我观察到两次测量之间没有(或非常小的)差异。我使用的是一台 8 核的机器,所以这很令人惊讶。我在代码中做错了什么?
请注意,我从中学到了所有这些。 http://pymotw.com/2/multiprocessing/communication.html
我知道“joblib”对于这样的示例可能更方便,但最终需要应用它的东西不适用于“joblib”。
【问题讨论】:
-
尊敬的先生,谢谢。我以前读过这个 GIL。我认为使用多处理(正如我在这里所做的那样,我相信)可以解决这个问题。我原本打算使用 OpenMP,但发现由于 GIL,这在 Python 中是不可能的。我猜 Python 并不是为高速并行任务而构建的。
-
感谢您的提醒,看来您是对的。从文档中,
multiprocessing“通过使用子进程而不是线程来有效地避开全局解释器锁”。说得通。所以无视我之前的评论。
标签: python python-3.x parallel-processing multiprocessing ipython