如何在不序列化的情况下使用Python多线程并行化另一个模块的函数?

1 投票
1 回答
2054 浏览
提问于 2025-04-17 15:33

在我实现一个支持向量机(svm)预测模型的时候,我想让一个叫 svmutil.svm_train 的函数可以同时运行多个线程。虽然我对多线程程序的实现还很陌生,但我对并行编程的一些概念有点了解,我相信同时用不同的参数训练多个模型在理论上是可行的。

设置:

import svmutil
import multiprocessing as mp

problem = svm_util.svm_read_problem('my_problem')
# I have a list of svm_param objects I want to train
params = myCode.svm_param_list()

# Calculate the number of worker threads
processes = mp.cpu_count() * 2

把训练过程分成多个执行线程:

pool = mp.Pool(processes)
for param in params:
    pool.apply(svmutil.svm_train, args=(problem, param,))

pool.close()
pool.join()

不过,我遇到的问题是 svmutil.svm_train 这个函数不能被“序列化”,因为它里面有一个c类型的指针。Python解释器给我报了错:

ValueError: ctypes objects containing pointers cannot be pickled

我宁愿调整我的实现方式,而不是想办法把这个模块里的函数“序列化”。所以,我想知道,有没有什么方法可以在不“序列化”这个函数的情况下,让它并行运行呢?

另外,我该如何收集这个函数的结果呢?理想情况下,我希望得到一个训练好的模型列表(也就是每次调用 svmutil.svm_train 函数的输出)。

1 个回答

1

我成功地使用了上面评论中提到的问题的最佳答案,来构建一个解决方案。我通过创建管道和进程,并监听结果,实现了对外部模块中Python函数的并行调用。我传递给管道的函数如下:pipe.send(svmutil.svm_train(problem,param)))

撰写回答