如何在不序列化的情况下使用Python多线程并行化另一个模块的函数?
在我实现一个支持向量机(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)))