我正在开发一个需要运行两个不同 CPU 密集型功能的项目。因此,使用多处理方法似乎是要走的路。我面临的挑战是一个函数的运行时间比另一个函数慢。为了争论,假设它execute
的运行时间为 0.1 秒,而运行update
时间为一整秒。目标是在update
运行execute
时将计算一个输出值 10 次。一旦update
完成,它需要传递一组参数,execute
然后可以继续使用新的参数集生成输出。一段时间后update
需要再次运行并再次生成一组新参数。
此外,这两个函数都需要一组不同的输入变量。
下面的图片链接应该希望能更好地可视化我的难题。
根据我收集到的信息(https://zetcode.com/python/multiprocessing/),使用非对称映射方法可能是可行的方法,但它似乎并没有真正起作用。任何帮助是极大的赞赏。
伪代码
from multiprocessing import Pool
from datetime import datetime
import time
import numpy as np
class MyClass():
def __init__(self, inital_parameter_1, inital_parameter_2):
self.parameter_1 = inital_parameter_1
self.parameter_2 = inital_parameter_2
def execute(self, input_1, input_2, time_in):
print('starting execute function for time:' + str(time_in))
time.sleep(0.1) # wait for 100 milliseconds
# generate some output
output = (self.parameter_1 * input_1) + (self.parameter_2 + input_2)
print('exiting execute function')
return output
def update(self, update_input_1, update_input_2, time_in):
print('starting update function for time:' + str(time_in))
time.sleep(1) # wait for 1 second
# generate parameters
self.parameter_1 += update_input_1
self.parameter_2 += update_input_2
print('exiting update function')
def smap(f):
return f()
if __name__ == "__main__":
update_input_1 = 3
update_input_2 = 4
input_1 = 0
input_2 = 1
# initialize class
my_class = MyClass(1, 2)
# total runtime (arbitrary)
runtime = int(10e6)
# update_time (arbitrary)
update_time = np.array([10, 10e2, 15e4, 20e5])
for current_time in range(runtime):
# if time equals update time run both functions simultanously until update is complete
if any(update_time == current_time):
with Pool() as pool:
res = pool.map_async(my_class.smap, [my_class.execute(input_1, input_2, current_time),
my_class.update(update_input_1, update_input_2, current_time)])
# otherwise run only execute
else:
output = my_class.execute(input_1, input_2,current_time)
# increment input
input_1 += 1
input_2 += 2