Python多功能多线程处理穿线。穿线?(线程数可变)

2024-09-27 09:28:26 发布

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

我试图启动一个可变数量的线程来计算我的一个自动交易模块的函数结果。我有大约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()方法中,但我不知道如何命名和输出每个线程的函数结果!我也不知道如何根据对应的参数调用列表中的函数!在

我这样做的原因是为了发现计算效率和时间之间的最佳线程数平衡。就像我说的,这将被整合到我正在开发的高频交易平台中,时间是我的主要限制!在

有什么想法吗?在


Tags: 模块函数列表数量np时间交易线程
2条回答

您可以像下面这样使用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。在

我希望这能帮你解决问题。在

  • 对于cpu受限的任务,应该使用multiprocessing,而不是线程。

  • 手动创建和管理流程可能很困难,需要付出更多的努力。请签出concurrent.futures,并尝试使用ProcessPool来维护一个进程池。您可以向他们提交任务并检索结果。

  • 来自multiprocessing模块的^{}方法可以接受一个函数和一个iterable,然后将它们并行地分块处理,以提高计算速度。iterable被分成几个独立的块。这些块在不同的进程中传递给函数。然后将结果放在一起。

相关问题 更多 >

    热门问题