hhr / hyperf-gotask

Go语言中Swoole TaskWorker的替代方案

dev-master 2023-06-30 06:14 UTC

This package is auto-updated.

Last update: 2024-09-30 01:41:19 UTC


README

英文 | 中文

Build Status

GoTask作为Swoole的侧边进程启动一个Go进程,并建立双向IPC通道来将重任务卸载给Go。可以将其视为Go语言的Swoole Taskworker。

composer require hyperf/gotask

特性

  • 高性能,占用资源小。
  • 基于Swoole 4协程socket API。
  • 支持Unix Socket,TCP和stdin/stdout管道。
  • 支持PHP到Go和Go到PHP的调用。
  • 自动管理侧边进程的生命周期。
  • 正确处理远程错误。
  • 支持结构化负载和二进制负载。
  • 侧边进程API与net/rpc兼容。
  • 内置连接池。
  • 可选集成Hyperf框架。

适用于

  • Swoole中的阻塞操作,如MongoDB查询。
  • CPU密集型操作,如编码和解码。
  • 利用Go生态系统,如Kubernetes客户端。

要求

  • PHP 7.2+
  • Go 1.13+
  • Swoole 4.4LTS+
  • Hyperf 1.1+ (可选)

任务交付示例

package main

import (
    "github.com/hhr0815hhr/gotask/v3/pkg/gotask"
)

type App struct{}

func (a *App) Hi(name string, r *interface{}) error {
    *r = map[string]string{
        "hello": name,
    }
    return nil
}

func main() {
    gotask.SetAddress("127.0.0.1:6001")
    gotask.Register(new(App))
    gotask.Run()
}
<?php

use Hyperf\GoTask\IPC\SocketIPCSender;
use function Swoole\Coroutine\run;

require_once "../vendor/autoload.php";

run(function(){
    $task = new SocketIPCSender('127.0.0.1:6001');
    var_dump($task->call("App.Hi", "Hyperf"));
    // [ "hello" => "Hyperf" ]
});

资源

英文文档尚未完成!请先查看示例。

基准测试

https://github.com/reasno/gotask-benchmark

致谢