代码如下:
<?php
class TaskWorker extends Worker
{
}
class Task extends Thread
{
public $data;
public function run()
{
$this->data = file_get_contents( "http://sipv4.com/json/101.224.212." . mt_rand(50,150) );
}
}
$stime = microtime(true);
//Work方式执行
/*$worker = new TaskWorker;
for ($i=1; $i <= 100; $i++) {
$worker->stack(new Task);
}
$worker->start();
while ( $worker->collect() );*/
//多线程方式执行
$tasks = array();
for ($i=1; $i <= 100; $i++) {
$tasks[$i] = new Task;
$tasks[$i]->start();
}
foreach ($tasks as $task) {
if ( $task->join() ) {
}
}
echo microtime(true) - $stime, "\n";
Worker方式执行100个任务用时10秒,多线程执行100个任务用时0.1秒,那么Worker::stack里的任务是同步运行的?如果是同步的,那么Worker的意义是什么呢?
Worker 是为了复用线程……
单个 Worker 里不同任务的当然是阻塞的,按你 stack 的顺序执行。
P.S. 话说都看到 stack/unstack 这个名字了你不应该直接反应过来这是个先进先出的“栈”了么……
线程的建立和销毁是有开销的,而 Worker 里不同的任务可以复用同一个线程,省下了这部分开销。这也带来一个额外的好处,就是可以复用上下文,通俗的讲就是变量可以共享。
而一般来说不会让你徒手操作的 Worker 的,都是通过 Pool 去管理,这样就可以实现类似其他支持多线程编程的语言里“线程池”这一特性了。