Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP线程池_Php_Multithreading_Threadpool - Fatal编程技术网

PHP线程池

PHP线程池,php,multithreading,threadpool,Php,Multithreading,Threadpool,编辑:澄清和简化:我正在寻找一种“好”方法,在可堆叠对象结束时向池中提交更多可堆叠对象(使用第一个可堆叠对象中的数据添加第二个)。我的想法是轮询对象直到其结束(效率低下且丑陋),并将引用传递给池对象(我无法使其工作)。 基本代码如下: 现在,完整描述如下: 我正在用PHP开发一个应用程序,它增长太多,需要花费很多时间。因此,我尝试使用线程池对该应用程序进行多线程处理(我知道PHP不是最好的选择,但我不想,目前无法更改语言) 问题是,应用程序有两个阶段,必须按顺序进行,每个阶段都有许多可以并发进行

编辑:澄清和简化:我正在寻找一种“好”方法,在可堆叠对象结束时向池中提交更多可堆叠对象(使用第一个可堆叠对象中的数据添加第二个)。我的想法是轮询对象直到其结束(效率低下且丑陋),并将引用传递给池对象(我无法使其工作)。 基本代码如下:

现在,完整描述如下:

我正在用PHP开发一个应用程序,它增长太多,需要花费很多时间。因此,我尝试使用线程池对该应用程序进行多线程处理(我知道PHP不是最好的选择,但我不想,目前无法更改语言)

问题是,应用程序有两个阶段,必须按顺序进行,每个阶段都有许多可以并发进行的子任务。这就是我脑海中的过程:

  • 在阶段1中将有N个子任务,这些子任务将是可堆叠的对象
  • 当子任务i结束时,必须通知“main”(创建池、可堆叠对象等的主体),并使用子任务i(不同的可堆叠对象)中的一些数据为子任务i执行阶段2。在此阶段中,阶段1的每个子任务将有M个子任务
我想对阶段1和阶段2中的线程使用相同的线程池,从阶段1到阶段2,我能想到的唯一解决方案是轮询N个子任务中的每一个子任务,直到其中一个子任务结束,然后对结束的子任务调用阶段2,并重复,直到所有N个子任务结束


我使用Joe Watkins的pthreads source中包含的线程池示例作为基本代码。

您应该从以下内容开始:

它似乎也能起作用:

//Simple example with Collectable (basically Thread meant for Pool) and Pool

<?php

class job extends Collectable {
  public $val;

  public function __construct($val){
    // init some properties
    $this->val = $val;
  }
  public function run(){
    // do some work
    $this->val = $this->val . file_get_contents('http://www.example.com/', null, null, 3, 20);
    $this->setGarbage();
  }
}

// At most 3 threads will work at once
$p = new Pool(3);

$tasks = array(
  new job('0'),
  new job('1'),
  new job('2'),
  new job('3'),
  new job('4'),
  new job('5'),
  new job('6'),
  new job('7'),
  new job('8'),
  new job('9'),
  new job('10'),
);
// Add tasks to pool queue
foreach ($tasks as $task) {
  $p->submit($task);
}

// shutdown will wait for current queue to be completed
$p->shutdown();
// garbage collection check / read results
$p->collect(function($checkingTask){
  echo $checkingTask->val;
  return $checkingTask->isGarbage();
});

?>
//带有Collectable(基本上线程是指池)和Pool的简单示例

“PHP不是最好的选择”有点轻描淡写。我没有意识到PHP变成了。我正在寻找从第1阶段到第2阶段的方法“PHP还不是线程安全的”这篇博文是用2008@JoeWatkins那么PHP正式成为线程安全的了?你可以考虑把这个事实作为答案。谢谢你的回答,非常有趣的阅读。但这并不是我所需要的。当阶段1的可堆叠内容结束时,必须处理数据,并创建新的可堆叠内容。对于第一阶段的每一个可堆叠文件,第二阶段可能会有1000个可堆叠文件。我今天是地球上第二繁忙的人,让我明天再回来给你举一个更好的例子……听起来像是我想做的:我想让任务或工作人员决定下一个在数据位上执行的任务是什么。我最终决定使用一个队列,它指定在哪一位数据上执行哪种任务,程序的主循环从队列中提取任务并将它们提交到池中。但仍然没有解决所有的bug,最重要的是:它不工作。
Thread 140012266239744 got data: 612
Thread 140012275222272 got data: 267
Thread 140012257257216 got data: 971
Thread 140012033140480 got data: 881
Thread 140012257257216 got data: 1000
Thread 140012016355072 got data: 261
Thread 140012257257216 got data: 510
Thread 140012016355072 got data: 148
Thread 140012016355072 got data: 501
Thread 140012257257216 got data: 767
Thread 140012024747776 got data: 504
Thread 140012033140480 got data: 401
Thread 140012275222272 got data: 20
<-- trimmed from 1000 lines -->
Thread 140012041533184 got data: 285
Thread 140012275222272 got data: 811
Thread 140012041533184 got data: 436
Thread 140012257257216 got data: 977
Thread 140012033140480 got data: 830
Thread 140012275222272 got data: 554
Thread 140012024747776 got data: 704
Thread 140012033140480 got data: 50
Thread 140012257257216 got data: 794
Thread 140012024747776 got data: 724
Thread 140012033140480 got data: 624
Thread 140012266239744 got data: 756
Thread 140012284204800 got data: 997
Thread 140012266239744 got data: 708
Thread 140012266239744 got data: 981
//Simple example with Collectable (basically Thread meant for Pool) and Pool

<?php

class job extends Collectable {
  public $val;

  public function __construct($val){
    // init some properties
    $this->val = $val;
  }
  public function run(){
    // do some work
    $this->val = $this->val . file_get_contents('http://www.example.com/', null, null, 3, 20);
    $this->setGarbage();
  }
}

// At most 3 threads will work at once
$p = new Pool(3);

$tasks = array(
  new job('0'),
  new job('1'),
  new job('2'),
  new job('3'),
  new job('4'),
  new job('5'),
  new job('6'),
  new job('7'),
  new job('8'),
  new job('9'),
  new job('10'),
);
// Add tasks to pool queue
foreach ($tasks as $task) {
  $p->submit($task);
}

// shutdown will wait for current queue to be completed
$p->shutdown();
// garbage collection check / read results
$p->collect(function($checkingTask){
  echo $checkingTask->val;
  return $checkingTask->isGarbage();
});

?>