求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
相关产品推荐
相关产品推荐

