{"id":15374330,"url":"https://github.com/yurunsoft/swoole-co-pool","last_synced_at":"2025-04-14T13:11:39.252Z","repository":{"id":34636321,"uuid":"181116042","full_name":"Yurunsoft/swoole-co-pool","owner":"Yurunsoft","description":"Swoole 协程工作池——来自宇润 PHP 全家桶","archived":false,"fork":false,"pushed_at":"2024-01-25T02:50:44.000Z","size":97,"stargazers_count":26,"open_issues_count":1,"forks_count":8,"subscribers_count":2,"default_branch":"develop","last_synced_at":"2025-03-28T02:14:19.033Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://gitee.com/yurunsoft/swoole-co-pool","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Yurunsoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-13T03:30:26.000Z","updated_at":"2024-12-16T05:36:39.000Z","dependencies_parsed_at":"2024-06-19T11:30:28.713Z","dependency_job_id":null,"html_url":"https://github.com/Yurunsoft/swoole-co-pool","commit_stats":{"total_commits":46,"total_committers":2,"mean_commits":23.0,"dds":0.04347826086956519,"last_synced_commit":"a928a18b19296ba13613efdaba9202baa76ec209"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yurunsoft%2Fswoole-co-pool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yurunsoft%2Fswoole-co-pool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yurunsoft%2Fswoole-co-pool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yurunsoft%2Fswoole-co-pool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Yurunsoft","download_url":"https://codeload.github.com/Yurunsoft/swoole-co-pool/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248886324,"owners_count":21177643,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-01T13:58:22.107Z","updated_at":"2025-04-14T13:11:37.961Z","avatar_url":"https://github.com/Yurunsoft.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# swoole-co-pool\n\n[![Latest Version](https://img.shields.io/packagist/v/yurunsoft/swoole-co-pool.svg)](https://packagist.org/packages/yurunsoft/swoole-co-pool)\n[![License](https://img.shields.io/github/license/Yurunsoft/swoole-co-pool.svg)](https://github.com/Yurunsoft/swoole-co-pool/blob/master/LICENSE)\n\n## 介绍\n\n本项目为 Swoole 协程工作池，它封装了一些实用的 Swoole 协程操作，使用起来十分一把梭。\n\n* 协程工作池\n\n用于需要大量协程任务的场景，它可以限定你的同时工作协程数量，并且减少协程频繁创建销毁的损耗。\n\n* 协程批量执行器\n\n用于同时执行多个协程，并且能够获取到他们所有的返回值。\n\n宇润PHP全家桶群：17916227 [![点击加群](https://pub.idqqimg.com/wpa/images/group.png \"点击加群\")](https://jq.qq.com/?_wv=1027\u0026k=5wXf4Zq)，如有问题会有人解答和修复。\n\n程序员日常划水群：74401592 [![点击加群](https://pub.idqqimg.com/wpa/images/group.png \"点击加群\")](https://shang.qq.com/wpa/qunwpa?idkey=e2e6b49e9a648aae5285b3aba155d59107bb66fde02e229e078bd7359cac8ac3)。\n\n## 安装\n\n在您的composer.json中加入配置：\n\n```json\n{\n    \"require\": {\n        \"yurunsoft/swoole-co-pool\": \"^1.3.0\"\n    }\n}\n```\n\n然后执行`composer update`命令。\n\n## 使用\n\n### 协程工作池\n\n```php\nuse Yurun\\Swoole\\CoPool\\CoPool;\nuse Yurun\\Swoole\\CoPool\\Interfaces\\ICoTask;\nuse Yurun\\Swoole\\CoPool\\Interfaces\\ITaskParam;\n\n$coCount = 10; // 同时工作协程数\n$queueLength = 1024; // 队列长度\n$pool = new CoPool($coCount, $queueLength,\n    // 定义任务匿名类，当然你也可以定义成普通类，传入完整类名\n    new class implements ICoTask\n    {\n        /**\n         * 执行任务\n         *\n         * @param ITaskParam $param\n         * @return mixed\n         */\n        public function run(ITaskParam $param)\n        {\n            // 执行任务\n            return true; // 返回任务执行结果，非必须\n        }\n\n    }\n);\n$pool-\u003erun();\n\n$data = 1; // 可以传递任何参数\n\n// 增加任务，并挂起协程等待返回任务执行结果\n$result = $pool-\u003eaddTask($data);\n\n// 增加任务，异步回调\n$result = $pool-\u003eaddTaskAsync($data, function(ITaskParam $param, $data){\n    // 异步回调\n});\n\n// 增加分组任务，并挂起协程等待返回任务执行结果\n$result = $pool-\u003eaddTask($data, '分组名称');\n\n// 增加分组任务，异步回调\n$result = $pool-\u003eaddTaskAsync($data, function(ITaskParam $param, $data){\n    // 异步回调\n}, '分组名称');\n\n$pool-\u003ewait(); // 等待协程池停止，不限时，true/false\n$pool-\u003ewait(60); // 等待协程池停止，限时60秒，如果为-1则不限时，true/false\n```\n\n### 批量执行协程\n\n每个方法都在单独的协程中被执行，然后可以统一获取到结果。\n\n```php\n$batch = new CoBatch([\n    function(){\n        return 'imi';\n    },\n    'a' =\u003e  function(){\n        return 'niu';\n    },\n    'b' =\u003e  function(){\n        return 'bi';\n    },\n]);\n$results = $batch-\u003eexec();\n// $timeout = -1; // 支持超时\n// $limit = -1; // 限制同时工作协程数量\n// $results = $batch-\u003eexec($timeout, $limit);\n// $results = $batch-\u003eexec($timeout, $limit, $throws); // 捕获异常\nvar_dump($results);\n// $results 值为:\n// [\n//     'imi',\n//     'a' =\u003e  'niu',\n//     'b' =\u003e  'bi',\n// ]\n// $throws 值为异常对象数组，成员键名和传入数组中的一致。没有异常则为空数组。\n// 超时异常类：Yurun\\Swoole\\CoPool\\Exception\\TimeoutException\n```\n\n快捷函数：\n\n```php\nuse function Yurun\\Swoole\\Coroutine\\batch;\nbatch([\n    function(){\n        return 'imi';\n    },\n    'a' =\u003e  function(){\n        return 'niu';\n    },\n    'b' =\u003e  function(){\n        return 'bi';\n    },\n]);\n// batch($callables, $timeout, $limit);\n// batch($callables, $timeout, $limit, true); // 捕获异常并在当前上下文抛出\n// batch($callables, $timeout, $limit, false, $throws); // 捕获异常\n// $throws 值为异常对象数组，成员键名和传入数组中的一致。没有异常则为空数组。\n// 超时异常类：Yurun\\Swoole\\CoPool\\Exception\\TimeoutException\n```\n\n### 批量执行协程(迭代器模式)\n\n支持通过数组、迭代器批量执行，并返回结果（不保证原始顺序）。  \n\u003e 1. 适合对大型结果集、不确定长度结果集进行协程并发计算并取得计算结果。  \n\u003e 2. 相对于普通批量执行（CoBatch）可以更好地控制内存使用量。\n\n```php\nuse Yurun\\Swoole\\CoPool\\CoBatchIterator;\n\n$input = function ($size = 100) {\n    while ($size--)\n    {\n        $random = mt_rand(100, 900);\n        yield $size =\u003e function () use ($random) {\n            // 模拟IO任务\n            usleep($random * 10);\n\n            return $random;\n        };\n    }\n};\n\n$timeout = -1; // 支持超时\n$limit = 8;    // 限制同时工作协程数量\n$batch = new CoBatchIterator($input(), $timeout, $limit);\n$iter = $batch-\u003eexec();\n\nforeach ($iter as $key =\u003e $value)\n{\n    if ($value \u003e 500)\n    {\n        // 获得符合要求的结果，执行相应的代码逻辑并中断循环\n        // 业务代码...\n        \n        // 可以发送`false`到迭代器中止仍在运行的协程快速回收资源\n        $iter-\u003esend(false);\n        break;\n    }\n}\n\n// 可以查看批量执行是以什么方式退出的\nvar_dump($result = $iter-\u003egetReturn());\n// $result === CoBatchIterator::SUCCESS; // 全部任务完成\n// $result === CoBatchIterator::BREAK;   // 执行被主动中断\n// $result === CoBatchIterator::TIMEOUT; // 任务超时\n// $result === CoBatchIterator::UNKNOWN; // 未知原因（一般情况不会发生）\n```\n\n快捷函数：\n\n```php\nuse function Yurun\\Swoole\\Coroutine\\batchIterator;\nbatchIterator([\n    function(){\n        return 'imi';\n    },\n    'a' =\u003e  function(){\n        return 'niu';\n    },\n    'b' =\u003e  function(){\n        return 'bi';\n    },\n]);\n// batchIterator($callables, $timeout, $limit);\n```\n\n### 执行单个协程并等待返回值\n\n```php\nuse function Yurun\\Swoole\\Coroutine\\goWait;\n$result = goWait(function(){\n    \\Swoole\\Coroutine::sleep(1);\n    return 'wait result';\n});\necho $result; // wait result\n\n// 最大执行时间 0.5 秒，超过时间返回 null，但任务不会中断\n$result = goWait(function(){\n    \\Swoole\\Coroutine::sleep(1);\n    return 'wait result';\n}, 0.5);\n\n// 捕获异常并在当前上下文抛出\ntry {\n    $result = goWait(function(){\n        throw new \\RuntimeException('gg');\n    }, -1, true); // 第 3 个参数传 true\n} catch(\\Throwable $th) {\n    var_dump($th);\n}\n```\n\n### 通道容器\n\n```php\nuse Yurun\\Swoole\\CoPool\\ChannelContainer;\n\ngo(function(){\n    $channelContainer = new ChannelContainer;\n\n    $id = 'abc';\n    $data = [\n        'time'  =\u003e  time(),\n    ];\n\n    go(function() use($id, $data, $channelContainer){\n        echo 'Wait 3 seconds...', PHP_EOL;\n        \\Swoole\\Coroutine::sleep(3);\n        $channelContainer-\u003epush($id, $data);\n    });\n    var_dump($channelContainer-\u003epop($id));\n\n});\n```\n\n## 代码示例\n\n详见 `example` 目录\n\n## 捐赠\n\n\u003cimg src=\"https://raw.githubusercontent.com/Yurunsoft/swoole-co-pool/master/res/pay.png\"/\u003e\n\n开源不求盈利，多少都是心意，生活不易，随缘随缘……\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyurunsoft%2Fswoole-co-pool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyurunsoft%2Fswoole-co-pool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyurunsoft%2Fswoole-co-pool/lists"}