python - python ProcessPoolExecutor在函数中不起作用
问题描述
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)
没有警告或错误但很长时间没有任何响应。
解决方案
你确实得到了一个错误。它的。
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)
推荐阅读
- compiler-errors - 如何修复内核编译器错误:预期 __ 在 ___ 之前
- c# - 在哪里放置“等待”?
- python - 列出目录python中的扩展名
- python - 在 CentOS 上涉及 Tkinter/matplotlib “没有显示名称和没有 $DISPLAY 环境变量”的错误
- email - 如何修复关闭 MailApp.sendemail 步骤中的“无效电子邮件未定义”错误
- javascript - 如何使用 javascript 读取包含(管道分隔)值的 .psv 文件数据
- swift - 除以 NumberFormatter .currency 以将价格转换为季度价格
- blockchain - 如何在solidity 0.5.2版中调用另一个合约内的合约?
- xcode - 架构 x86_64 的未定义符号:引用自:libyoga.a(Yoga.o) 中的 _YGConfigNew
- visual-studio-code - 当我只用韩语在全文末尾按 ENTER 时,自动在字母之间插入换行符