多处理将所有核心用于相同的代码

问题描述 投票:0回答:1

我有一个元组列表,它们在循环内使用来执行一些计算。计算可能需要一些时间,因此我想尝试将任务分配给多个处理核心(以加快速度)。这里出了点问题。

首先:我在运行代码时检查了每个核心的性能,并且使用了所有核心,但似乎(根据结果)每个核心都执行了相同的计算。例如:如果我想做 1+1、2+2 和 3+3,我想确保一个核心执行 1+1,一个核心执行 2+2,另一个核心执行 3+3。现在所有三个核心都执行 1+1、2+2 和 3+3(所以我得到了三次结果)。

第二件事是我检查了计算时间,使用多重处理比不使用多重处理花费更多时间,我认为这不应该发生。

我在下面做了一个小代码示例。所有需要一些时间的计算都是在函数“func”的 for 循环下执行的,这是我想要使用更多 CPU 核心的部分。示例代码可以直接测试,列表会减少到前 20 次迭代,这样就不会花费太长时间(如果需要,请调整此值)。

from multiprocessing import Process
import numpy as np
import itertools
import time
import math

def func(list_products):
    
    # for i in range(len(list_total_product)):
    for i in range(len(list_products)):
        
        # Perform calculations
        i

""" Creating the list """
# Input
item1_deviation = 1 #%
item1_steps = 10

item2_deviation = 10 #%
item2_N = 3 # minimum of 2


# Create first list
item1_base = 360
item1_deviation_rounded = item1_base * (item1_deviation / 100)
list_item1s = np.arange(item1_base - item1_deviation_rounded,
                                item1_base + item1_deviation_rounded+item1_deviation,
                                item1_steps).tolist()
list_item1s = [int(math.ceil(item / item1_steps)) * item1_steps for item in list_item1s]


# Create second list
item2_base = 0.77
list_item2s = np.linspace(item2_base - (item2_base * (item2_deviation / 100)),
                         item2_base + (item2_base * (item2_deviation / 100)),
                         item2_N).tolist()
list_item2s = [round(item, 3) for item in list_item2s]


# Create the number of combinations
list_total_sequence = []
for i in range(6):
    
    list_sequence = [list_item1s, list_item2s]
    list_product = list(itertools.product(*list_sequence))
    
    list_total_sequence.append(list_product)
    
list_total_product = list(itertools.product(*list_total_sequence))



""" Without Multiprocessing """
t1 = time.perf_counter()

# for i in range(len(list_total_product)):
for i in range(len(list_total_product[0:20])):
    
    # Perform calculations
    i

t2 = time.perf_counter()

print(t2-t1)



""" With Multiprocessing """
if __name__ == '__main__':
    
    t1 = time.perf_counter()
    
    p = Process(target=func, args=(list_total_product[0:20],))
    p.start()
    p.join()
    
    t2 = time.perf_counter()
        
    print(t2-t1)

可以启用/禁用“不使用多重处理”和“使用多重处理”下的代码

我做错了什么?

python multiprocessing
1个回答
0
投票

您只创建了一个进程。如果你想创建多个进程,你需要做类似的事情

processes = []
for [1,2,3]:
    processes.append(Process(target=func, args=(list_total_product[0:20],)))
for p in processes
    p.start()
for p in processes
    p.join()
© www.soinside.com 2019 - 2024. All rights reserved.