piotrek-r/worker

一个简单的工人实现,循环回调函数直到满足定义的条件之一

0.1.3 2023-06-16 22:16 UTC

This package is auto-updated.

Last update: 2024-09-17 00:56:48 UTC


README

一个简单的工人实现,循环回调函数直到满足定义的条件之一

安装

composer require piotrek-r/worker

使用

基本使用

$worker = new \PiotrekR\Worker\Worker();

$worker->run(function () {
    // do something
});

回调函数应在执行了一些工作后返回一个真值,否则返回一个假值。这用于确定停止条件和休眠时间。

条件

可以使用 WorkerConditions 为工人设置停止条件。

条件:时间限制

您可以设置秒为单位的时间限制。

$workerConditions = new \PiotrekR\Worker\WorkerConditions(
    timeSeconds: 10,
);

$worker = new \PiotrekR\Worker\Worker($workerConditions);

$worker->run(function () {
    // do something
});

条件:内存限制

您可以设置字节数为整数的内存限制,也可以设置为带有单位后缀的字符串。支持的单位有:bkmgtpezy。它使用 memory_get_usage(true) 来确定当前内存使用。

$workerConditions = new \PiotrekR\Worker\WorkerConditions(
    memoryLimit: '512m',
);

$worker = new \PiotrekR\Worker\Worker($workerConditions);

$worker->run(function () {
    // do something
});

条件:循环限制

您可以设置循环限制。达到给定次数的循环后,将停止工人。

循环限制有三种不同类型

  • countLoops - 其他类型的总和
  • countHandled - 函数返回真值的循环次数
  • countEmpty - 函数返回假值的循环次数

仅进行100次循环,无论结果如何

$workerConditions = new \PiotrekR\Worker\WorkerConditions(
    countLoops: 100,
);

当函数返回 true 时仅运行5次,当函数返回 false 时无限循环

$workerConditions = new \PiotrekR\Worker\WorkerConditions(
    countHandled: 5,
);

无限循环,并在函数第一次返回 false 时停止(例如,在清空队列时,它将一直运行直到队列为空)

$workerConditions = new \PiotrekR\Worker\WorkerConditions(
    countEmpty: 1,
);

配置

休眠时间

您可以设置微秒为单位的休眠时间。每次循环后,它会休眠。您可以为循环后有真值和假值的情况设置不同的休眠时间。

$workerConfiguration = new \PiotrekR\Worker\WorkerConfiguration(
    sleepMicrosecondsAfterHandled: 1000, // 1ms to get quick to the next item
    sleepMicrosecondsAfterEmpty: 5000000, // 5s to not spam the queue
);

$worker = new \PiotrekR\Worker\Worker(null, $workerConfiguration);

$worker->run(function () {
    // do something
});

参数

您可以将参数传递给 run 方法。所有参数都将传递给回调函数。

$arg1 = 'foo';
$arg2 = 'bar';
$arg3 = 3;

$worker = new \PiotrekR\Worker\Worker();

$worker->run(function (string $arg1, string $arg2, int $arg3) {
    echo $argument;
    return true;
}, $arg1, $arg2, $arg3);

结果

run 方法返回一个包含以下方法的 WorkerResult 对象

  • getTimeElapsed(): int - 已经过去的时间(以秒为单位)
  • getCountLoops(): int - 其他类型的总和
  • getCountHandled(): int - 函数返回真值的循环次数
  • getCountEmpty(): int - 函数返回假值的循环次数

示例

use PiotrekR\Worker\Worker;
use PiotrekR\Worker\WorkerConditions;
use PiotrekR\Worker\WorkerConfiguration;

$queue = new ThirdPartyQueueHandler();

$workerConditions = new WorkerConditions(
    timeSeconds: 10,
    memory: '512m',
);

$workerConfiguration = new WorkerConfiguration(
    sleepMicrosecondsAfterHandled: 1000,
    sleepMicrosecondsAfterEmpty: 1000000,
);

$worker = new Worker($workerConditions, $workerConfiguration);

$result = $worker->run(function (ThirdPartyQueueHandler $queue) {
    return $queue->handleNextMessage();
}, $queue);

printf(
    "It took %d seconds to loop %d times. Of which %d were handled, and %d were empty.\n",
    $result->getTimeElapsed(),
    $result->getCountLoops(),
    $result->getCountHandled(),
    $result->getCountEmpty(),
);