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

求AMPHP Future返回数据示例:如何从协程向主线程返回结果

在AMPHP中从线程协程返回结果到主线程

下面是使用LocalParcel实现线程协程向主线程返回计算结果的完整示例:

<?php

require __DIR__ . '/vendor/autoload.php';

use Amp\Sync\LocalParcel;
use Amp\Sync\Worker;
use Amp\Sync\WorkerPool;
use Amp\Sync\LocalWorkerPool;

// 主线程创建Parcel,用于线程间数据传递
$parcel = new LocalParcel();

// 初始化本地线程池
$pool = new LocalWorkerPool();

// 从线程池获取Worker实例
$worker = $pool->getWorker();

// 向Worker提交任务:在子线程协程中计算并写入结果
$worker->submit(function () use ($parcel) {
    // 模拟计算得到结果3
    $result = 3;
    // 将结果写入Parcel,供主线程读取
    $parcel->write($result);
});

// 主线程等待并读取Parcel中的结果
$result = $parcel->read();

echo "主线程获取到的结果:" . $result . PHP_EOL;

// 释放Worker并关闭线程池
$worker->release();
$pool->shutdown();

关键说明:

  • LocalParcel是AMPHP Sync提供的线程间同步通信工具,支持跨线程安全读写
  • 子线程协程通过$parcel->write($result)写入计算结果
  • 主线程通过$parcel->read()以协程方式等待并获取结果,直到子线程完成写入
  • 使用后需释放Worker到线程池,关闭池避免资源泄漏

如果是同一进程内的协程通信(非跨线程),直接在协程中return结果,主线程用await获取即可:

<?php

require __DIR__ . '/vendor/autoload.php';

// 定义计算协程
$compute = function () {
    // 模拟耗时计算
    Amp\delay(1);
    return 3; // 直接返回结果
};

// 主线程await协程获取结果
$result = Amp\await($compute());

echo "主线程获取到的协程结果:" . $result . PHP_EOL;

场景区分:

  • 跨线程通信:使用LocalParcel或其他同步工具传递数据
  • 同进程协程通信:直接返回结果,用await或Future获取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:05:03