pthreads Worker的意义是什么?

代码如下:

<?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的意义是什么呢?

阅读 1.8k
1 个回答

Worker 是为了复用线程……

单个 Worker 里不同任务的当然是阻塞的,按你 stack 的顺序执行。

P.S. 话说都看到 stack/unstack 这个名字了你不应该直接反应过来这是个先进先出的“栈”了么……

线程的建立和销毁是有开销的,而 Worker 里不同的任务可以复用同一个线程,省下了这部分开销。这也带来一个额外的好处,就是可以复用上下文,通俗的讲就是变量可以共享。

而一般来说不会让你徒手操作的 Worker 的,都是通过 Pool 去管理,这样就可以实现类似其他支持多线程编程的语言里“线程池”这一特性了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题