2026a

# @everywhere


在所有进程上运行相同的表达式

# 语法

@everywhere [procs()] expr

# 说明

在所有的 Julia 进程的主模块 Main 中执行表达式 expr,但不返回Future对象。

该宏常用于加载分布式计算的基本环境,如:模块、变量、函数定义。

任何进程上的运行错误都会被收集到CompositeException中并抛出。

额外的可选参数procs允许输入指定进程 ID,以在指定进程中而非所有进程中执行对应表达式。

可选参数procs允许指定所有进程的一个子集来执行表达式,需注意以下两个特性:

  • usingimport语句会首先运行在调用进程上,以确保包已预编译。
  • 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

# 另请参阅

procs | addprocs