在实现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/

10-09 19:47
查看更多