Swoole入门:执行异步任务01(使用案列,简单逻辑梳理)
2018-01-16 17:08
435 查看
比如有这样一个需求:前端用户注册表单提交入库,紧接着发送确认邮件,然后赠送积分。
如果这三部分是一个
如果是
https://wiki.swoole.com/wiki/page/481.html
1、处理用户注册的swoole服务端代码 user_reg_server.php
2、客户端用户注册,连接上swoole,传递数据 addUser.php
开始服务,客户端去连接会很快返回
服务端打印:
如果这三部分是一个
同步任务,那么用户在前端要等待最后“赠送积分”完成,才能确定自己是否注册成功。
如果是
异步任务,那么我们可以在”用户注册表单提交入库”成功之后,就返回给前端用户。
https://wiki.swoole.com/wiki/page/481.html
1、处理用户注册的swoole服务端代码 user_reg_server.php
<?php /** * 这是我们处理用户注册swoole服务代码 * */ $serv = new swoole_server("10.211.55.15", 9501); // 设置异步任务的工作进程数量 $serv->set(array('task_worker_num' => 4)); $serv->on('receive', function($serv, $fd, $from_id, $data) { if(1){ // if里是伪代码:用户数据入库逻辑 // 如果入库成功,后面2个任务才异步执行 // 投递"发送邮件"这个异步任务 $task_email = $serv->task($data); // 这里的$data 是客户端传递过来的 // 投递"赠送积分"这个异步任务 $task_gif = $serv->task($data); // 上面2个异步任务成功分发 // 可以给客户端发送一个提示信息 $serv->send($fd, "register success"); } }); // 处理异步任务 $serv->on('task', function ($serv, $task_id, $from_id, $data) { // 执行任务的具体代码 echo "New AsyncTask[id=$task_id]".PHP_EOL; //返回任务执行的结果 return 1; // 在onTask函数中只要return一个字符串或者非null的变量,都表示投递的task已完成 }); // 处理异步任务的结果 $serv->on('finish', function ($serv, $task_id, $data) { echo "AsyncTask[$task_id] Finish: $data".PHP_EOL; }); // 开始 $serv->start();
2、客户端用户注册,连接上swoole,传递数据 addUser.php
<?php /* * 这是用户注册部分,用户注册逻辑(也就是我们的web网站可能和我们的Swoole服务不在同一台机器上) * */ $userInfo = ['name'=>'jack','email'=>'jack@qq.com']; // 这是我们准备传递给swoole服务端的数据 // 创建swoole客户端 $client = new swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect("10.211.55.15", 9501, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } // 发送 用户数据 到服务端 $client->send(json_encode($userInfo)); // 接收服务端返回的内容 echo $client->recv(); // 关闭客户端 $client->close();
开始服务,客户端去连接会很快返回
register success。
服务端打印:
New AsyncTask[id=1] New AsyncTask[id=0] AsyncTask[1] Finish: 1 AsyncTask[0] Finish: 1
相关文章推荐
- jfinal-akka 使用akka执行异步任务
- 使用AsyncTask做异步任务以及BaseAdapter的getview方法的逻辑问题
- GCD的简单使用,开辟一条新的线程,让上面的任务串行执行
- 简单的异步任务工具——rq 的使用教程
- Java编程的逻辑 (77) - 异步任务执行服务
- Service学习——第五篇 使用IntentService在单独线程上执行异步任务
- IAsyncResult异步执行回调方法的简单使用
- 使用SwingWorker为界面执行异步任务
- 使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
- C# 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕
- APScheduler执行定时任务---简单使用
- 使用本地服务异步执行自定义活动业务逻辑
- 使用SwingWorker为界面执行异步任务
- Android级连异步任务——Bolts-Android简单使用(一)
- Android 异步任务AsyncTask类的简单使用
- spring boot使用自定义配置的线程池执行Async异步任务
- Android中使用Handler和异步任务(AsyncTack)来为UI线程执行费时操作
- 使用Timer为界面执行异步任务
- Android中使用Handler和异步任务(AsyncTack)来为UI线程执行费时操作
- service的简单使用--后台执行的定时任务