【问题标题】:python ProcessPoolExecutor do not work when in functionpython ProcessPoolExecutor在函数中不起作用
【发布时间】:2019-11-19 23:03:24
【问题描述】:

python ProcessPoolExecutor 在命令行中工作,但添加到函数后不运行

它是这样工作的

from concurrent import futures

def multi_process(func, paras, threads):
    with futures.ProcessPoolExecutor(max_workers=threads) as pool:
        res = pool.map(func, paras, chunksize=threads)
    return list(res)
p = multi_process(func,paras,threads)

但根本不工作,如下所示

def upper(paras,threads):
    def func:
        some func
    def multi_process(func, paras, threads):
        with futures.ProcessPoolExecutor(max_workers=threads) as pool:
            res = pool.map(func, paras, chunksize=threads)
        return list(res)
    p = multi_process(func,paras,threads)
    return p
p = upper(paras,threads)

没有警告或错误但很长时间没有任何响应。

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    您确实遇到了错误。它的。

    AttributeError: Can't pickle local object 'upper.<locals>.func'.
    

    原因是多处理工作需要在全局级别定义函数。

    要实现您想要的,您可以执行以下操作:

    from concurrent import futures
    
    # Has to be a global function
    def func(para):
        print(para)
    
    
    def upper(paras,threads):
        # This cannot be a local function.
        #def func(para):
        #    print(para)
        def multi_process(func, paras, threads):
            with futures.ProcessPoolExecutor(max_workers=threads) as pool:
                res = pool.map(func, paras, chunksize=threads)
            return list(res)
        p = multi_process(func, paras, threads)
        return p
    
    paras = [1, 2, 3]
    threads = 3
    p = upper(paras,threads)
    

    【讨论】:

    • 非常感谢,它现在真的有效,它实际上没有响应或抛出任何错误,可能是因为代码在 jupyter notebook 中执行。
    • 是的,这就是您没有看到任何错误的原因。如果这回答了您的问题,请将其标记为已回答,这将有助于查看此问题的其他用户。
    猜你喜欢
    • 2018-06-21
    • 2019-01-22
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多