Skip to content

远程调用与异步消息

在 Monarch 中,调用 Actor 的方法不仅仅是函数调用,而是一次消息传递

1. 异步调用 (Futures)

当你调用一个 Actor 的 @endpoint 方法时,控制权会立即返回,而不会阻塞等待结果。Monarch 返回一个 Future 对象。

python
# 假设 workers 是我们在上一节创建的 Actor 组对象
# workers = procs.spawn("my_workers", Worker, ...)

# 发起调用:计算 10 * 10 + worker_id
# 这条指令会广播给所有 4 个 Actor
future = workers.compute.call(10)

print("Request sent! Doing other work...")
# 此时,主线程可以继续执行其他任务,而不用等待 GPU 计算完成

2. 获取结果

当你确实需要计算结果时,调用 Future 对象的 .result().get() 方法。这会阻塞当前线程,直到结果返回。

python
# 获取结果(阻塞)
results = future.get()

print(f"Results: {results}")
# 输出可能类似: [100, 100, 100, 100]

3. 为什么是异步的?

异步设计是高性能分布式的关键:

  1. 隐藏延迟:网络传输需要时间,异步允许 CPU 在等待网络 IO 时继续工作。
  2. 流水线并行:你可以连续发送多个请求(例如多个 mini-batch),让 GPU 保持忙碌,而不需要每一步都停下来同步。

示例:流水线调用

python
futures = []
for i in range(5):
    print(f"Dispatching task {i}...")
    # 连续发送 5 个任务,几乎瞬间完成
    fut = workers.compute.call(i)
    futures.append(fut)

print("All tasks dispatched. Collecting results...")

# 统一收集结果
for i, fut in enumerate(futures):
    print(f"Task {i} result: {fut.get()}")

通过这种方式,Monarch 让你能够轻松编写出高并发的控制逻辑。

Monarch中文教程