在python中利用多处理和值解决问题

2024-06-01 07:05:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我确实有几个巨大的函数,我想利用python中一个单独的处理器来解决每个函数。我用值来捕捉每个处理器的输出,最后进行求和,得到所有函数的最终结果。下面这个简单的例子说明了一切。然而,当我在实际问题中使用相同的过程时,我发现程序只使用一个处理器。另外,解决问题所需的时间不受多重处理的影响,这也是我的代码有问题的另一个原因。 下面我准备了一个简单的例子,用于多处理和数值求解几个分离的函数,并在最后进行求和。这个例子一切正常,如果你检查windows或mac中的处理器(在终端中键入'top'命令),你可以看到程序使用了多个处理器。在

from multiprocessing import Process as mp
import multiprocessing
import time
a= time.time()
def f1(num,Amin1):
    time.sleep(1)
    Amin1.value = num*2 
    #print(Amin1)

def f2(num,Amin2):
    time.sleep(1)
    Amin2.value = num*3
    #print(Amin2)

def f3(num,Amin3):
    time.sleep(1)
    Amin3.value = num*2 
    #print(Amin1)

def f4(num,Amin4):
    time.sleep(1)
    Amin4.value = num*3
    #print(Amin2)

def f5(num,Amin5):
    time.sleep(1)
    Amin5.value = num*2 
    #print(Amin1)

def f6(num,Amin6):
    time.sleep(1)
    Amin6.value = num*3
    #print(Amin2)

Amin1 = multiprocessing.Value('d',0.0)
Amin2 = multiprocessing.Value('d',0.0)
Amin3 = multiprocessing.Value('d',0.0)
Amin4 = multiprocessing.Value('d',0.0)
Amin5 = multiprocessing.Value('d',0.0)
Amin6 = multiprocessing.Value('d',0.0)

results1 = mp(target=f1, args=(3,Amin1))
results2 = mp(target=f2, args=(4,Amin2))
results3 = mp(target=f3, args=(3,Amin3))
results4 = mp(target=f4, args=(4,Amin4))
results5 = mp(target=f5, args=(3,Amin5))
results6 = mp(target=f6, args=(4,Amin6))

results1.start()
results2.start()
results3.start()
results4.start()
results5.start()
results6.start()

results1.join()
results2.join()
results3.join()
results4.join()
results5.join()
results6.join()

print(Amin1.value+Amin2.value+Amin3.value+\
     Amin4.value+Amin5.value+Amin6.value)

b=time.time()
print(b-a)

以上代码一切正常。 现在在我的例子中,我将使用相同的程序,但这就像下面的代码。在

^{pr2}$

在上面的代码中,我调用了一个错误函数。下面提供了ERROR函数,并在其中使用了多过程。在


#Define objective function-min sq
def ERROR(w):

    #============================
    w = w.tolist()
    #============================


    V_error_SWG_4B_100 = multiprocessing.Value('d',0.0)
    V_error_SWG_4B_150 = multiprocessing.Value('d',0.0)
    V_error_SWG_4B_200 = multiprocessing.Value('d',0.0)
    V_error_BSS_4B_100 = multiprocessing.Value('d',0.0)
    V_error_BSS_4B_150 = multiprocessing.Value('d',0.0)
    V_error_BSS_4B_200 = multiprocessing.Value('d',0.0)
    V_Single_3000_BR20 = multiprocessing.Value('d',0.0)
    V_Single_7100_BR20 = multiprocessing.Value('d',0.0)
    V_Single_21500_BR20 = multiprocessing.Value('d',0.0)
    V_f_Blunt_D_SWG_BR20 = multiprocessing.Value('d',0.0)
    V_Single_19400_BR5 = multiprocessing.Value('d',0.0)
    V_Single_19400_BR10 = multiprocessing.Value('d',0.0)
    V_Single_19400_BR15 = multiprocessing.Value('d',0.0)
    V_Single_19400_BR20 = multiprocessing.Value('d',0.0)
    V_Single_19400_BR25 = multiprocessing.Value('d',0.0)
    V_Single_19400_BR30 = multiprocessing.Value('d',0.0)

    results_error_SWG_4B_100 = mp(target=error_SWG_4B_100, args=(w,V_error_SWG_4B_100))
    results_error_SWG_4B_150 = mp(target=error_SWG_4B_150, args=(w,V_error_SWG_4B_150))
    results_error_SWG_4B_200 = mp(target=error_SWG_4B_200, args=(w,V_error_SWG_4B_200))
    results_error_BSS_4B_100 = mp(target=error_BSS_4B_100, args=(w,V_error_BSS_4B_100))
    results_error_BSS_4B_150 = mp(target=error_BSS_4B_150, args=(w,V_error_BSS_4B_150))
    results_error_BSS_4B_200 = mp(target=error_BSS_4B_200, args=(w,V_error_BSS_4B_200))
    results_Single_3000_BR20 = mp(target=Single_3000_BR20, args=(w,V_Single_3000_BR20))
    results_Single_7100_BR20 = mp(target=Single_7100_BR20, args=(w,V_Single_7100_BR20))
    results_Single_21500_BR20 = mp(target=Single_21500_BR20, args=(w,V_Single_21500_BR20))
    results_f_Blunt_D_SWG_BR20 = mp(target=f_Blunt_D_SWG_BR20, args=(w,V_f_Blunt_D_SWG_BR20))
    results_Single_19400_BR5 = mp(target=Single_19400_BR5, args=(w,V_Single_19400_BR5))
    results_Single_19400_BR10 = mp(target=Single_19400_BR10, args=(w,V_Single_19400_BR10))
    results_Single_19400_BR15 = mp(target=Single_19400_BR15, args=(w,V_Single_19400_BR15))
    results_Single_19400_BR20 = mp(target=Single_19400_BR20, args=(w,V_Single_19400_BR20))
    results_Single_19400_BR25 = mp(target=Single_19400_BR25, args=(w,V_Single_19400_BR25))
    results_Single_19400_BR30 = mp(target=Single_19400_BR30, args=(w,V_Single_19400_BR30))

    results_error_SWG_4B_100.start()
    results_error_SWG_4B_150.start()
    results_error_SWG_4B_200.start()
    results_error_BSS_4B_100.start()
    results_error_BSS_4B_150.start()
    results_error_BSS_4B_200.start()
    results_Single_3000_BR20.start()
    results_Single_7100_BR20.start()
    results_Single_21500_BR20.start()
    results_f_Blunt_D_SWG_BR20.start()
    results_Single_19400_BR5.start()
    results_Single_19400_BR10.start()
    results_Single_19400_BR15.start()
    results_Single_19400_BR20.start()
    results_Single_19400_BR25.start()
    results_Single_19400_BR30.start()

    results_error_SWG_4B_100.join()
    results_error_SWG_4B_150.join()
    results_error_SWG_4B_200.join()
    results_error_BSS_4B_100.join()
    results_error_BSS_4B_150.join()
    results_error_BSS_4B_200.join()
    results_Single_3000_BR20.join()
    results_Single_7100_BR20.join()
    results_Single_21500_BR20.join()
    results_f_Blunt_D_SWG_BR20.join()
    results_Single_19400_BR5.join()
    results_Single_19400_BR10.join()
    results_Single_19400_BR15.join()
    results_Single_19400_BR20.join()
    results_Single_19400_BR25.join()
    results_Single_19400_BR30.join()

    ERROR_value1 =\
    V_error_SWG_4B_100.value+\
    V_error_SWG_4B_150.value+\
    V_error_SWG_4B_200.value+\
    V_error_BSS_4B_100.value+\
    V_error_BSS_4B_150.value+\
    V_error_BSS_4B_200.value
    #============================
    ERROR_value2 =\
    4*V_Single_3000_BR20.value+\
    4*V_Single_7100_BR20.value+\
    V_Single_21500_BR20.value+\
    V_f_Blunt_D_SWG_BR20.value+\
    V_Single_19400_BR5.value+\
    V_Single_19400_BR10.value+\
    V_Single_19400_BR15.value+\
    V_Single_19400_BR20.value+\
    V_Single_19400_BR25.value+\
    V_Single_19400_BR30.value

    #============================
    ERROR_value = (ERROR_value1/6 + ERROR_value2/16)/2
    #============================
    #print(ERROR_value1/ERROR_value2)
    #print(ERROR_value2)

    return (ERROR_value)

主函数(de)调用ERROR函数和inside ERROR函数,我调用16个其他函数使用多处理。但是,运行以上代码是无效的,因为我看到程序只使用一个处理器。 谢谢你的帮助。在


Tags: targetvalueargserrormpmultiprocessingstartresults