2026a
# @everywhere
在所有进程上运行相同的表达式
# 语法
@everywhere [procs()] expr
# 说明
在所有的 Julia 进程的主模块 Main 中执行表达式 expr,但不返回Future对象。
该宏常用于加载分布式计算的基本环境,如:模块、变量、函数定义。
任何进程上的运行错误都会被收集到CompositeException中并抛出。
额外的可选参数procs允许输入指定进程 ID,以在指定进程中而非所有进程中执行对应表达式。
可选参数procs允许指定所有进程的一个子集来执行表达式,需注意以下两个特性:
using和import语句会首先运行在调用进程上,以确保包已预编译。include使用的当前源文件路径会被传播到其他进程。
# 示例
多进程运行相同表达式
多进程环境
通过配置多进程环境,使用在本地带有 4 个工作进程的 Julia 进程运行以下示例。
@everywhere function myfunction()
println("进程 $(myid()) - Hello")
end
@everywhere myfunction()
进程 1 - Hello
From worker 3: 进程 3 - Hello
From worker 2: 进程 2 - Hello
From worker 4: 进程 4 - Hello
From worker 5: 进程 5 - Hello
如果不在定义处加@everywhere,会因其他进程未定义而报错:
function myfunction_nomacro()
println("进程 $(myid()) - Hello")
end
@everywhere myfunction_nomacro()
进程 1 - Hello
ERROR: On worker 2:
UndefVarError: myfunction_nomacro not defined
...
如果不在调用处加@everywhere,会因其他进程未调用而只有主进程执行:
@everywhere function myfunction()
println("进程 $(myid()) - Hello")
end
myfunction()
进程 1 - Hello
多进程定义变量
@everywhere bar=1
将在所有当前进程上定义Main.bar。
之后添加的任何进程(例如使用addprocs())并不会定义这个表达式。
@everywhere可以通过插值来广播进程已定义的局部变量:
foo = 1
@everywhere bar=$foo