本文实例讲述了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