python中多处理作业生成器的区别

问题描述

我需要使用不同的输入参数运行相同的函数,这将花费很长时间,但幸运的是我知道它只需要 1 个 CPU 内核,所以我决定在 python 中使用多处理器包并行运行它们。假设我的 CPU 中有 4 个内核,并且我有 8 个不同的参数要尝试,因此我认为以下代码的时间成本将是运行单个作业的时间成本的 2 倍:

from multiprocessing import Pool

def a_hard_work(parameter):
    #do some time-cost work with parameter as input

class IterableAdapter:
    """https://stackoverflow.com/a/39564774"""
    def __init__(self,iterable_factory,length=None):
        self.iterable_factory = iterable_factory
        self.length = length

    def __iter__(self):
        return iter(self.iterable_factory())
        
def loader(param_set):

    def loader():
        for param in param_set:
            yield param

    return IterableAdapter( lambda: loader() ) 

def worker(parameter):
    a_hard_work(parameter)

if __name__ == "__main__":

    param_set = [1,2,3,4,5,6,7,8]

    tasks = loader(param_set)

    with Pool() as p:
        for i in p.imap_unordered(worker,tasks):
            try:
                pass
            except Exception as e:
                print(e)

然而它花费的时间比我排除的要长得多,所以我检查了我的 CPU 的使用情况,我发现在这个脚本运行期间只有 1 个 CPU 核心被使用,所有其他 3 个核心都没有负载。

然后我将代码更改为以下内容:(我认为应该相同):

from multiprocessing import Pool

def a_hard_work(parameter):
    #do some time-cost work with parameter as input

def loader(param_set):
    for param in param_set:
        yield param

def worker(parameter):
    a_hard_work(parameter)

if __name__ == "__main__":

    param_set = [1,tasks):
            try:
                pass
            except Exception as e:
                print(e)

这次脚本按照我的例外运行,但是我生成作业的两种方式有什么区别?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)