Julia 1.6.1使用pmap报TypeError问题及@everywhere用法咨询
报错原因分析
- 核心逻辑错误:你在
pmap中传入的匿名函数x->polyRootS(x) ? error("failed") : x存在语法逻辑问题,三元运算符的首位要求返回布尔值,但polyRootS(x)的返回值是ComplexF64类型的根数组,Julia无法将数组转换为布尔值做条件判断,直接触发TypeError,报错信息中第四个参数就是polyRootS正常返回的根数组,完全对应这个问题。 - 进程初始化顺序错误:你先执行
@everywhere using PolynomialRoots再调用addprocs(2),新增的2个worker进程不会执行之前的@everywhere语句,既没有加载PolynomialRoots包,也没有test全局变量,即使修复匿名函数问题也会触发未定义错误。
修复后的代码示例
using Distributed # 先添加所有工作进程,再做全局同步 addprocs(2) # 所有进程统一执行的逻辑可以放在同一个@everywhere块中 @everywhere begin using PolynomialRoots const test = ones(Int64, 10,10) # 用const修饰全局变量比global性能更优 function polyRootS(n) q = test[:,n] return roots(q) end end function parPolyRoots() # 直接传入目标函数即可,不需要多余的布尔判断逻辑 return pmap(polyRootS, 1:10; on_error=identity) end # 串行调用验证 for i in 1:10 r = polyRootS(i) println(r) end # 并行调用 res = parPolyRoots() println("并行执行结果:", res)
常见问题解答
pmap使用说明
pmap是Julia标准库Distributed提供的并行映射函数,会将输入的可迭代对象拆分后分发到各个worker进程执行传入的函数,再将结果汇总返回,适合处理计算密集型、各次调用无依赖的任务。
基础使用示例:
using Distributed addprocs(4) # 添加4个工作进程 @everywhere f(x) = x^2 res = pmap(f, 1:10) # 并行计算1-10的平方 # 输出结果为 [1,4,9,16,25,36,49,64,81,100]
@everywhere使用规范
可以在单个@everywhere begin end语句块中统一引入依赖包、定义全局数据和函数,这也是官方推荐的做法,只需要注意必须先执行addprocs添加完所有工作进程,再执行@everywhere语句,否则新增的进程不会同步块内的内容。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

