You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mojo中编写异步代码?解决Coroutine不可复制报错

Mojo异步代码编译错误与Coroutine使用、resume解析

编译错误原因

你遇到的Coroutine[Int, {}] is not copyable错误,核心原因是Mojo的Coroutine类型仅支持移动语义,不支持复制:

  • 当你执行var task = add_three(1, 2, 3)时,task持有了Coroutine实例的所有权;后续await task尝试复制这个实例,但Coroutine没有实现__copyinit__复制构造方法,因此触发编译错误。
  • 直接var task = await add_three(...)能运行,是因为await直接消费了async函数返回的临时Coroutine实例,不需要复制操作,但这种写法会立即等待任务完成,无法实现并行异步执行。

实现真正异步执行的正确写法

要实现并行异步,你有两种可行方式:

方式1:使用move转移所有权

如果要存储Coroutine后再await,通过move关键字转移实例所有权,避免复制:

async fn add_three(a: Int, b: Int, c: Int) -> Int:
    return a + b + c

async fn call_it():
    var task = add_three(1, 2, 3)
    print(await move task)  # 转移所有权,避免复制操作

方式2:使用TaskGroup管理并行任务

如果需要同时执行多个异步任务,用TaskGroup可以高效管理并行执行流程:

async fn add_three(a: Int, b: Int, c: Int) -> Int:
    return a + b + c

async fn call_it():
    var group = TaskGroup()
    # 提交多个异步任务到任务组
    let task1 = group.add(add_three(1, 2, 3))
    let task2 = group.add(add_three(4, 5, 6))
    
    # 等待所有任务完成
    await group.join()
    
    # 获取并打印结果
    print(await task1)
    print(await task2)

关于resume的含义与操作

Mojo的Coroutine是可暂停/恢复的执行体,resume就是让处于暂停状态的协程继续执行:

  • 当你调用async函数时,返回的Coroutine初始处于暂停状态(未开始执行或执行到暂停点);
  • 使用await时,底层会自动调用resume()驱动协程执行,直到它完成或再次暂停,无需手动调用。

如果需要手动控制协程执行,可以直接调用Coroutine的resume()方法,搭配get_result()获取最终结果(适合同步场景):

async fn add_three(a: Int, b: Int, c: Int) -> Int:
    return a + b + c

fn main():
    var coro = add_three(1, 2, 3)
    coro.resume()  # 手动恢复协程执行
    print(coro.get_result())  # 获取执行结果

内容的提问来源于stack exchange,提问作者Samufi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:13:13