如何使用 python 多线程并行化来自另一个模块的函数而不进行酸洗?
Posted
技术标签:
【中文标题】如何使用 python 多线程并行化来自另一个模块的函数而不进行酸洗?【英文标题】:How to parallelise a function from another module using python multithreading without pickling it? 【发布时间】:2013-01-27 03:43:24 【问题描述】:在我的 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
每次调用该函数时的输出)。
【问题讨论】:
这里讨论***.com/questions/3288595/… 不知道是不是真的是svmutil.svm_train
还是不能腌制的参数之一?
【参考方案1】:
我设法在上面评论中链接的问题中使用top answer 来构建解决方案。通过生成管道和进程并监听结果,我能够在外部模块中并行调用 python 函数。我传入管道的函数如下:pipe.send(svmutil.svm_train(problem,param)))
【讨论】:
以上是关于如何使用 python 多线程并行化来自另一个模块的函数而不进行酸洗?的主要内容,如果未能解决你的问题,请参考以下文章
一行 Python 实现并行化 -- 日常多线程操作的新思路