yoshi2889/tasks

支持多种任务类型的简单任务控制器。

v0.1.2 2018-08-13 21:19 UTC

This package is auto-updated.

Last update: 2024-08-30 01:14:13 UTC


README

Build Status Scrutinizer Code Quality Scrutinizer Code Coverage Latest Stable Version Latest Unstable Version Total Downloads

支持多种任务类型的简单任务控制器。

安装

您可以通过 composer 安装此类

composer require yoshi2889/tasks

用法

创建 TaskController 的实例,并向其中添加任何 TaskInterface 的实例

<?php

$loop = React\EventLoop\Factory::create();
$taskController = new \Yoshi2889\Tasks\TaskController($loop);

// A simple callback task, run only once, which will trigger in 10 seconds:
$callbackTask = new \Yoshi2889\Tasks\CallbackTask(function ()
{
	echo 'Hello world!' . PHP_EOL;
}, 10);
// Output (after 10 seconds): Hello world!

可重复任务

RepeatableTask 实例是一个在其子任务上运行间隔的任务。在 RepeatableTask 开始运行子任务之前,它首先检查其过期时间是否已通过。如果没有,则不会运行任务。

例如,创建一个新的每 5 秒运行一次前一个 CallbackTaskRepeatableTask

$repeatableTask = new \Yoshi2889\Tasks\RepeatableTask($callbackTask, 5);

此任务将在之前在 CallableTask 中定义的 10 秒过后才开始运行。

取消任务

任务可以被提前取消。如何处理取消取决于任务类型。例如,如果我们取消一个 RepeatableTask,它将内部取消其子任务并停止重复,然后将被丢弃

$repeatableTask->cancel();

然而,如果我们取消一个 CallbackTask,它将仅处于无法由 TaskController 运行的状态,并在下一次运行时被丢弃。

TaskController 永远不应自己取消任务,这是用户的责任。

丢弃任务

默认情况下,在其 run() 方法中不返回新任务的 Task 将被丢弃。但是,如果一个 Task 返回了新任务,原始 Task 本身将被丢弃,而返回的任务实例将替换它。我们可以通过以下片段观察这一点

$callbackTask = new \Yoshi2889\Tasks\CallbackTask(function ()
{
	echo 'Hello ';
	return new \Yoshi2889\Tasks\CallbackTask(function ()
	{
		echo 'world!' . PHP_EOL;
	}, 5); 
}, 5);
// Output (after 10 seconds): Hello world!

丢弃的任务将被从 TaskController 中移除。

实现自定义任务

TaskController 接受实现 TaskInterface 接口的任何类。此接口包含以下方法

  • getExpiryTime(): int:获取任务应该运行并之后丢弃的 UNIX 时间戳。请注意,默认情况下,TaskController 以 1 秒间隔运行,时间可能略有偏差。
  • run(): ?TaskInterface:运行实际任务。返回实现 TaskInterface 的对象以插入新任务,或返回 null 以丢弃当前任务。
  • cancel(): void:用于取消任务或将任务置于无法运行的状态。在调用此方法后,最好让 getExpiryTime() 总是返回 0,以便任务将被丢弃。

许可证

此代码在 MIT 许可证下发布。请参阅 LICENSE 阅读它。