0

0

Swoole怎么异步执行一个耗时任务

尼克

尼克

发布时间:2025-10-05 22:30:02

|

706人浏览过

|

来源于php中文网

原创

Swoole通过Task Worker、Process和协程实现异步任务处理。在Web服务中推荐使用Task Worker,将耗时任务如发邮件、数据导入等投递至task进程异步执行,避免阻塞主进程;可通过task()方法提交任务,在on('task')中处理,完成后触发on('finish')回调。对于非服务器场景,可使用Swoole\Process创建独立子进程执行任务,并通过Process::wait()回收防止僵尸进程。在协程环境下,可使用Co::exec执行外部命令,虽为同步执行但不阻塞其他协程,真正异步仍需结合task或进程。根据环境选择合适方式:Web用Task Worker,常驻脚本用Process,协程轻量操作用Co::exec。

swoole怎么异步执行一个耗时任务

Swoole 提供了多种方式来异步执行耗时任务,避免阻塞主进程或协程,提升服务响应性能。最常用的方式是使用 异步进程(Process)Task Worker 来处理耗时操作,比如发送邮件、写日志、数据导入导出等。

使用 Task Worker 异步处理任务

这是 Swoole 中推荐的做法,适用于 HTTP 服务器、WebSocket 服务器等场景。

在 Swoole 服务器中开启 task worker,将耗时任务投递到 task 进程中异步执行。

示例代码:

启动一个支持 task 的 Swoole 服务器:

$http = new Swoole\Http/Server("127.0.0.1", 9501);

// 设置 task 工作进程数量
$http->set([
    'task_worker_num' => 4,
]);

// 处理普通请求
$http->on('request', function ($request, $response) use ($http) {
    if (isset($request->post['action']) && $request->post['action'] == 'slow_task') {
        // 投递一个耗时任务
        $taskID = $http->task("模拟一个耗时任务,比如发送邮件");
        $response->end("任务已提交,ID: {$taskID}");
    } else {
        $response->end("Hello Swoole");
    }
});

// 处理任务(在 task 进程中执行)
$http->on('task', function ($server, $task) {
    // 模拟耗时操作
    sleep(5); // 实际中可能是调用 API、写文件、发短信等
    echo "任务完成:{$task->data}\n";

    // 可以返回结果给 finish 回调
    $server->finish("任务 {$task->id} 完成");
});

// 任务完成后的回调(可选)
$http->on('finish', function ($server, $taskID, $data) {
    echo "任务 {$taskID} 的结果:{$data}\n";
});

$http->start();

说明:

MiniMax开放平台
MiniMax开放平台

MiniMax-与用户共创智能,新一代通用大模型

下载
  • task() 方法会把任务数据交给一个空闲的 task 进程异步执行。
  • on('task') 是任务实际执行的地方,不会影响主 Reactor 线程。
  • on('finish') 接收任务完成的通知,适合做后续处理。

使用 Swoole Process 创建独立异步进程

如果你不需要集成到服务器中,也可以手动创建子进程来异步执行任务。

$process = new Swoole\Process(function (Swoole\Process $worker) {
    // 子进程中执行耗时任务
    sleep(3);
    file_put_contents('/tmp/async.log', "任务完成时间:" . date('Y-m-d H:i:s') . "\n", FILE_APPEND);
    $worker->exit(0);
}, false, false);

$pid = $process->start();
echo "异步任务已启动,PID: {$pid}\n";

// 不等待,继续执行其他逻辑

你还可以通过 Process::wait() 在主进程回收子进程,防止僵尸进程。

协程环境下异步执行(Co::exec 或 go())

在 Swoole 协程环境中,如果只是“非阻塞”执行外部命令,可以使用 Co::exec

go(function () {
    $result = Co::exec("python /scripts/data_process.py"); // 执行脚本
    echo "脚本输出:{$result['output']}";
});
// 主协程继续执行,不阻塞

注意:这仍然是同步执行该命令,但放在协程里不会阻塞其他协程。若要真正异步,建议结合进程或 task 使用。

基本上就这些常用方式。根据你的运行环境选择:

  • Web 服务中用 Task Worker 最合适。
  • 常驻脚本可用 Swoole\Process
  • 协程内轻量操作可用 Co::exec 配合调度。

相关专题

更多
swoole为什么能常驻内存
swoole为什么能常驻内存

swoole常驻内存的特性:1. 事件驱动模型减少内存消耗;2. 协程并行执行任务占用更少内存;3. 协程池预分配协程消除创建开销;4. 静态变量保留状态减少内存分配;5. 共享内存跨协程共享数据降低内存开销。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

290

2024.04.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

410

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

1858

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1986

2024.08.16

Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

20

2025.12.22

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

121

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号