在实现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
的输出)。 最佳答案
我设法在上面评论中链接的问题中使用top answer构建解决方案。我能够通过生成管道和进程并监听结果来并行化对外部模块中python函数的调用。我传递给管道的函数如下:pipe.send(svmutil.svm_train(problem,param)))
关于python - 如何使用python多线程从另一个模块并行化一个函数而不腌制它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14822313/