本文实例讲述了PHP使用Pthread实现的多线程操作。分享给大家供大家参考,具体如下:
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
|
<?php
class vote extends Thread {
public $res = '' ;
public $url = array ();
public $name = '' ;
public $runing = false;
public $lc = false;
public function __construct( $name ) {
$this ->res = '暂无,第一次运行.' ;
$this ->param = 0;
$this ->lurl = 0;
$this ->name = $name ;
$this ->runing = true;
$this ->lc = false;
}
public function run() {
while ( $this ->runing) {
if ( $this ->param != 0) {
$nt = rand(1, 10);
echo "线程[{$this->name}]收到任务参数::{$this->param},需要{$nt}秒处理数据.\n" ;
$this ->res = rand(100, 999);
sleep( $nt );
$this ->lurl = $this ->param;
$this ->param = '' ;
} else {
echo "线程[{$this->name}]等待任务..\n" ;
}
sleep(1);
}
}
}
//这里创建线程池.
$pool [] = new vote( 'a' );
$pool [] = new vote( 'b' );
$pool [] = new vote( 'c' );
//启动所有线程,使其处于工作状态
foreach ( $pool as $w ) {
$w ->start();
}
//派发任务给线程
for ( $i = 1; $i < 10; $i ++) {
$worker_content = rand(10, 99);
while (true) {
foreach ( $pool as $worker ) {
//参数为空则说明线程空闲
if ( $worker ->param== '' ) {
$worker ->param = $worker_content ;
echo "[{$worker->name}]线程空闲,放入参数{$worker_content},上次参数[{$worker->lurl}]结果[{$worker->res}].\n" ;
break 2;
}
}
sleep(1);
}
}
echo "所有线程派发完毕,等待执行完成.\n" ;
//等待所有线程运行结束
while ( count ( $pool )) {
//遍历检查线程组运行结束
foreach ( $pool as $key => $threads ) {
if ( $worker ->param== '' ) {
echo "[{$threads->name}]线程空闲,上次参数[{$threads->lurl}]结果[{$threads->res}].\n" ;
echo "[{$threads->name}]线程运行完成,退出.\n" ;
//设置结束标志
$threads ->runing = false;
unset( $pool [ $key ]);
}
}
echo "等待中...\n" ;
sleep(1);
}
echo "所有线程执行完毕.\n" ;
|
希望本文所述对大家php程序设计有所帮助。