Julia中使用pmap()结合推导式报错问题咨询
为什么用推导式调用pmap会报错?
先聊聊最常见的几种情况,看看你是不是踩了这些坑:
1. 你可能把pmap的用法搞反了
pmap本身就是用来批量并行处理整个集合的工具,如果你在推导式里循环每个元素,每次只给pmap传一个元素的小集合(比如[i]),这不光是效率极低(相当于每次启动一个分布式任务就处理一个元素),还可能因为频繁创建/销毁并行任务导致资源冲突报错。
举个错误示例:
using Distributed addprocs(2) @everywhere function myfunc(x) return x^2 end # 错误:推导式里逐个调用pmap result = [pmap(myfunc, [i])[1] for i in 1:5]
正确的做法应该是直接把整个集合传给pmap,完全不需要推导式:
# 正确:一次性让pmap处理整个集合 result = pmap(myfunc, 1:5)
2. 工作进程没同步函数定义
如果你的函数没有用@everywhere宏标记,那么只有主进程知道这个函数,工作进程会找不到它,调用pmap时就会抛出RemoteException。
比如错误写法:
using Distributed addprocs(2) # 没加@everywhere,工作进程不知道myfunc function myfunc(x) return x^2 end result = pmap(myfunc, 1:5) # 报错:找不到myfunc
解决方法很简单,给函数加上@everywhere,确保所有工作进程都能拿到函数定义:
@everywhere function myfunc(x) return x^2 end
3. 推导式的作用域陷阱(少见但可能)
如果你的推导式里用到了外部变量,而这些变量没有被正确序列化到工作进程,也可能出问题。比如:
const offset = 2 @everywhere function myfunc(x) return x + offset # offset在工作进程里未定义 end # 错误:推导式里调用pmap(其实这里不用推导式也会错) result = [pmap(myfunc, [i])[1] for i in 1:5]
这种情况需要把变量也同步到工作进程:
@everywhere const offset = 2 @everywhere function myfunc(x) return x + offset end
总结一下,最可能的问题就是没必要用推导式嵌套pmap,或者没同步函数/变量到工作进程。你可以对照自己的代码看看是哪种情况~
内容的提问来源于stack exchange,提问作者Le Minaw
相关产品推荐
相关产品推荐

