使用 Python 的多处理。Pool(),我真的在做多处理吗?



我目前正在研究"多处理"包。这是我在"multiprocessing.Process"one_answers"multiprocession.Pool"上尝试的一个简单代码。

import random
import multiprocessing
import time

def list_append(count, id, out_list):
"""
Creates an empty list and then appends a 
random number to the list 'count' number
of times. A CPU-heavy operation!
"""
for i in range(count):
out_list.append(random.random())

if __name__ == "__main__":
size = 10000000   # Number of random numbers to add
procs = 8   # Number of processes to create
# Create a list of jobs and then iterate through
# the number of processes appending each process to
# the job list 
print('number of CPU: ', multiprocessing.cpu_count())
starting = time.time()
jobs = []
for i in range(procs):
out_list = list()
process = multiprocessing.Process(target=list_append, 
args=(size, i, out_list))
jobs.append(process)
# Start the processes (i.e. calculate the random number lists)      
for j in jobs:
j.start()
# Ensure all of the processes have finished
for j in jobs:
j.join()
print("jobs one done in {}".format(time.time()-starting))
starting = time.time()
for i in range(procs):
p = multiprocessing.Pool(8)
p.starmap(list_append, [(size, i, list())])
print('jobs two done in {}'.format(time.time()-starting))

我的笔记本电脑有12个杯芯,所以我预计第一项工作和第二项工作会在类似的时间内完成。然而,作业一在3秒内完成,但作业二在12秒内完成。在我看来,"multiprocessing.Pool(("实际上并没有执行多进程。。。我做错了什么吗?

在第二项工作中,您没有使用多处理。starmap()将指定的方法(list_append(分配给第二个参数中提供的每个arg列表,但您只提供了一个包含一个元素的列表,因此for循环的每个迭代都执行一个过程。我想你是想做的:

p = multiprocessing.Pool(8)
p.starmap(list_append, [(size, i, list()) for i in range(procs)])

而不包含CCD_ 4循环。

还要注意,starmap等待结果,因此在for循环中,它等待每个进程。

相关内容

  • 没有找到相关文章

最新更新