php任务调度器,PHP实现简单的协程任务调度demo示例

尹弘壮
2023-12-01

本文实例讲述了PHP实现简单的协程任务调度。分享给大家供大家参考,具体如下:

class Task

{

protected $taskId;

protected $coroutine;

protected $sendValue = null;

protected $beforeFirstYield = true;

public function __construct($taskId, Generator $coroutine)

{

$this->taskId = $taskId;

$this->coroutine = $coroutine;

}

public function getTaskId()

{

return $this->taskId;

}

public function setSendValue($sendValue)

{

$this->sendValue = $sendValue;

}

public function run()

{

if ($this->beforeFirstYield) {

$this->beforeFirstYield = false;

return $this->coroutine->current();

} else {

$retval = $this->coroutine->send($this->sendValue);

$this->sendValue = null;

return $retval;

}

}

public function isFinished()

{

return !$this->coroutine->valid();

}

}

class Scheduler

{

protected $maxTaskId = 0;

protected $taskMap = []; // taskId => task

protected $taskQueue;

public function __construct()

{

$this->taskQueue = new SplQueue();

}

public function newTask(Generator $coroutine)

{

$tid = ++$this->maxTaskId;

$task = new Task($tid, $coroutine);

$this->taskMap[$tid] = $task;

$this->schedule($task);

return $tid;

}

public function schedule(Task $task)

{

$this->taskQueue->enqueue($task);

}

public function run()

{

while (!$this->taskQueue->isEmpty()) {

$task = $this->taskQueue->dequeue();

$task->run();

if ($task->isFinished()) {

unset($this->taskMap[$task->getTaskId()]);

} else {

$this->schedule($task);

}

}

}

}

function task1()

{

for ($i = 1; $i <= 10; ++$i) {

echo "This is task 1 iteration $i.\n";

sleep(1);

yield;

}

}

function task2()

{

for ($i = 1; $i <= 10; ++$i) {

echo "This is task 2 iteration $i.\n";

sleep(1);

yield;

}

}

$scheduler = new Scheduler;

$scheduler->newTask(task1());

$scheduler->newTask(task2());

$scheduler->run();

运行结果:

This is task 1 iteration 1.

This is task 1 iteration 2.

This is task 1 iteration 3.

This is task 1 iteration 4.

This is task 1 iteration 5.

This is task 1 iteration 6.

This is task 1 iteration 7.

This is task 1 iteration 8.

This is task 1 iteration 9.

This is task 1 iteration 10.

希望本文所述对大家PHP程序设计有所帮助。

 类似资料: