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

2025-05-29 0 29

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90
<?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程序设计有所帮助。

原文链接:https://blog.csdn.net/qq_22640823/article/details/103596953

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP实现简单的协程任务调度demo示例 https://www.kuaiidc.com/90956.html

相关文章

发表评论
暂无评论