我目前正在研究"多处理"包。这是我在"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循环中,它等待每个进程。