我正在尝试启动可变数量的线程来计算我的一个自动交易模块的函数结果。我有大约14个函数,所有这些函数都是计算上昂贵的。我一直在按顺序计算每个功能,但是需要大约3分钟才能完成,我的平台频率很高,我需要将计算时间缩短到1分钟或更短。
我已经阅读了多处理和多线程,但我找不到符合我需要的解决方案。
我要做的是定义要使用的“n”个线程数,然后将我的函数列表划分为“n”个组,然后在单独的线程中计算每组函数。基本上:
functionList = [func1,func2,func3,func4]
outputList = [func1out,func2out,func3out,func4out]
argsList = [func1args,func2args,func3args,func4args]
# number of threads
n = 3
functionSplit = np.array_split(np.array(functionList),n)
outputSplit = np.array_split(np.array(outputList),n)
argSplit = np.array_split(np.array(argsList),n)
现在我想开始“n”个单独的线程,每个线程根据拆分列表处理函数。然后我想根据outputList
命名每个函数的输出,并创建每个函数输出的主dict。然后我将循环输出dict并根据每列中的信息创建一个具有列ID号的数据帧(已经有这部分,只需要多线程)。
有没有办法做这样的事情?我一直在寻找创建threading.Thread
类的子类并将函数,输出名称和参数传递给run()
方法,但我不知道如何命名和输出结果每个线程的功能!我也不知道如何根据相应的参数调用列表中的函数!
我这样做的原因是为了发现计算效率和时间之间的最佳线程数平衡。就像我说的,这将被整合到我正在开发的高频交易平台中,时间是我的主要约束!
有什么想法吗?
答案 0 :(得分:1)
您可以使用下面的multiprocessing
库
import multiprocessing
def callfns(fnList, argList, outList, d):
for i in range(len(fnList)):
d[somekey] = fnList[i](argList, outList)
...
manager = multiprocessing.Manager()
d = manager.dict()
processes = []
for i in range(len(functionSplit)):
process = multiprocessing.Process(target=callfns, args=(functionSplit[i], argSplit[i], outputSplit[i], d))
processes.append(process)
for j in processes:
j.start()
for j in processes:
j.join()
# use d here
您可以使用服务器进程在这些进程之间共享字典。要与服务器进程交互,您需要Manager
。然后,您可以在服务器进程manager.dict()
中创建字典。一旦所有进程连接回主进程,您就可以使用字典d
。
我希望这可以帮助您解决问题。
答案 1 :(得分:1)
您应该使用multiprocessing
而不是线程来处理cpu绑定任务。
手动创建和管理流程可能很困难,需要更多努力。签出concurrent.futures
并尝试ProcessPool
来维护进程池。您可以向他们提交任务并检索结果。
来自multiprocessing
模块的Pool.map
方法可以采用函数并且可迭代,然后以块的形式并行处理它们以更快地计算。可迭代被分解为单独的块。这些块在单独的进程中传递给函数。然后将结果放回原处。