如何使用 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 实现并行化 -- 日常多线程操作的新思路

Python的多进程模块multiprocessing

Python线程化多个bash子进程?

41 Python - python并行编程 多线程之——thread模块(已经过时,开发不推荐)

使用 data.table 并行化/多线程

在 Python 中通过线程/核心/节点并行化 for 循环