hyperf 其他组件 一 Task

这篇具有很好参考价值的文章主要介绍了hyperf 其他组件 一 Task。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

教程:Hyperf

为防止有些函数导致堵塞进程,使用task模拟携程处理。本质上是多进程运行阻塞函数,性能取决于Task Worker数量。

这块的实现我没看懂。

一、安装

composer require hyperf/task

 二、配置

Task不是默认配置,须在server.php中加Task配置。

#config/autoload/server.php 
'settings' => [
        ……
        // Task Worker 数量,根据您的服务器配置而配置适当的数量
        'task_worker_num' => 2,
        // 因为 `Task` 主要处理无法协程化的方法,所以这里推荐设为 `false`,避免协程下出现数据混淆的情况
        'task_enable_coroutine' => false,
],
'callbacks' => [
        ……
        // Task callbacks
        SwooleEvent::ON_TASK => [Hyperf\Framework\Bootstrap\TaskCallback::class, 'onTask'],
        SwooleEvent::ON_FINISH => [Hyperf\Framework\Bootstrap\FinishCallback::class, 'onFinish'],
],

三、使用

1、主动方法投递

namespace App\Task;

use Hyperf\Utils\Coroutine;

//主动投递方式
class MethodTask
{
    public function handle($cid)
    {
        return [
            'worker.cid' => $cid,
            // task_enable_coroutine 为 false 时返回 -1,反之 返回对应的协程 ID
            'task.cid' => Coroutine::id(),
        ];
    }
}

#App\Controller\TestController
public function test4()
    {
        $container = ApplicationContext::getContainer();
        $exec = $container->get(TaskExecutor::class);
        $result = $exec->execute(new Task([MethodTask::class, 'handle'], [Coroutine::id()]));
        var_dump($result);
    }


#输出
array(2) {
  ["worker.cid"]=>
  int(4)
  ["task.cid"]=>
  int(-1)
}
#Hyperf\Task\TaskExecutor
public function execute(Task $task, float $timeout = 10)
    {
        if (!$this->server instanceof Server) {
            throw new TaskExecuteException('The server does not support task.');
        }
        $taskId = $this->server->task($task, $task->workerId);
        if ($taskId === false) {
            throw new TaskExecuteException('Task execute failed.');
        }

        $result = $this->factory->pop($taskId, $timeout);

        if ($result instanceof Exception) {
            $exception = $this->normalizer->denormalize($result->attributes, $result->class);
            if ($exception instanceof \Throwable) {
                throw $exception;
            }

            throw new TaskExecuteException(get_class($exception) . ' is not instance of Throwable.');
        }

        return $result;
    }


#vendor\swoole\ide-helper\src\swoole\Swoole\Server.php
  public function task($data, $worker_id = null, ?callable $finish_callback = null)
    {
    }

 其他地方也没找到task对应的方法实现……

2、使用注释

namespace App\Task;

use Hyperf\Task\Annotation\Task;
use Hyperf\Utils\Coroutine;

class AnnotationTask
{
    /**
     * @Task
     */
    public function handle($cid)
    {
        return [
            'worker.cid' => $cid,
            // task_enable_coroutine=false 时返回 -1,反之 返回对应的协程 ID
            'task.cid' => Coroutine::id(),
        ];
    }
}

#App\Controller\TestController
public function test5()
    {
        $container = ApplicationContext::getContainer();
        $task = $container->get(AnnotationTask::class);
        $result = $task->handle(Coroutine::id());
        var_dump($result);
    }


#输入内容
array(2) {
  ["worker.cid"]=>
  int(2)
  ["task.cid"]=>
  int(-1)
}
namespace App\Task;
use Hyperf\Utils\Coroutine;

class AnnotationTask
{
    public function handle($cid)
    {
        return [
            'worker.cid' => $cid,
            // task_enable_coroutine=false 时返回 -1,反之 返回对应的协程 ID
            'task.cid' => Coroutine::id(),
        ];
    }
}

#App\Controller\TestController
public function test5()
    {
        $container = ApplicationContext::getContainer();
        $task = $container->get(AnnotationTask::class);
        $result = $task->handle(Coroutine::id());
        var_dump($result);
    }


#输出内容
array(2) {
  ["worker.cid"]=>
  int(2)
  ["task.cid"]=>
  int(2)
}

 最后这种是错误使用,应该没关联到server。文章来源地址https://www.toymoban.com/news/detail-635767.html

到了这里,关于hyperf 其他组件 一 Task的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Bootstrap03购物车页面&登录注册界面&其他组件使用

    目录 案例1:实现购物车页面布局 效果图  案例2:实现登录注册界面 效果图  案例3:图标组件的使用 效果图  熟悉其他的(页面内容-组件)等效果 页面内容:表格-Table 组件:按钮-Buttons 表单组件:Forms 折叠 滚动监听 下拉菜单 分页 导航-面包屑导航等等

    2024年02月03日
    浏览(57)
  • vue将某个组件打包成js,在其他项目使用

    1、首先创建一个组件的文件,里面包括了组件页面和index.js,index.js的作用是把组件暴露出去,目录结构: 2、index.js里面的内容 3、配置package.json打包命令,可以通过 --mode 后面参数指定打包环境 注意:目前vue.config.js里面是没有任何配置的,到这里其实就可以了,运行打包命

    2024年02月16日
    浏览(62)
  • Android 从其他xml文件中获取View组件数据

    问题 Android Studio 我想在 trace.java 从setting.java绑定的页面activity_setting.xml中 的editview中获取数据 解决方案 仅适用于 在同一应用的不同组件之间共享数据 在 SettingActivity.java 中,当用户准备离开当前活动时,可以将 EditText 中的数据保存到一个全局变量或者共享的存储位置。常见

    2024年02月14日
    浏览(52)
  • 【微信小程序】自定义组件布局会议OA其他页面(附源码)

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的

    2024年02月08日
    浏览(49)
  • 微信小程序canvas层级太高,与其他非原生组件层级冲突

     官网已经提出新版本以支持同层渲染,但是实际项目中层级还是冲突的。  最后在文档中找到这样一段话,用真机打开,层级就正常了 。所以建议大家,多使用真机调试去测试!!!!

    2024年02月11日
    浏览(48)
  • QT6安装完成后,再安装低版本的MinGW或其他组件方式

    1,首先登录自己账户 2,然后进入欢迎中,点击“添加和移除组件” 3,然后检索自己需要的安装内容

    2024年02月11日
    浏览(39)
  • hyperf 十四 国际化

    官方网址:Hyperf 文件结构:         /storage/languages/en/messages.php         /storage/languages/zh_CH/messages.php 创建文件 /config/autoload/translation.php。 多语言的调用从注入开始,即HyperfTranslationTranslator::__construct(TranslatorLoaderInterface $loader, string $locale)方法。根据配置文件Translato

    2024年02月11日
    浏览(58)
  • hyperf 十、分页

    教程:Hyperf 我用的hyperf2需要自己安装 执行的时候会调用rm删除文件 window调用会有问题,但是也有解决办法。 先删除 runtime/container,再改composer.json 根据代码可以增加参数,比如path。  nextPageUrl         获取下一页路径 render        使用给定视图呈现分页器 hasMorePages

    2024年02月16日
    浏览(22)
  • hyperf 十三 视图

    教程:Hyperf composer地址:hyperf/view - Packagist 本次测试使用twig twig composedr地址:twig/twig - Packagist twig 文档地址:Home - Twig - The flexible, fast, and secure PHP template engine 创建 config/autoload/view.php文件。  若task没引入,则引入task。 Task 模式下,视图渲染工作是在 Task Worker 进程中完成的。

    2024年02月11日
    浏览(21)
  • hyperf协程

            我们已经知道了协程可以很好的解决异步非阻塞系统的开发问题,那么协程本身到底是什么呢?从定义上来说, 协程是一种轻量级的线程,由用户代码来调度和管理,而不是由操作系统内核来进行调度,也就是在用户态进行 。可以直接的理解为就是一个非标准的

    2024年02月15日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包