「ハック」タグがまだない理由はわかりませんが(PHPでリストするのは申し訳ありません)、しかし...
ハックのマルチスレッド/非同期機能を使用して、複数のスレッドを使用して配列を歩くことができるかどうか/どのようにできるか疑問に思っています。私はこれを本当に必要としませんが、それは好奇心であり、役に立つかもしれません.
「ハック」の非同期機能のドキュメントを見てきました
http://docs.hhvm.com/manual/en/hack.async.php
そしてちょっと難しい。
これが私が作りたい(または完成させたい)ものの基本的な考え方です:
a) 配列を x セクションに分割し、x "スレッド" で処理するか、b) x スレッドを作成し、それぞれが最新の利用可能な項目を処理します。スレッドがアイテムを処理するとき、親スレッドに新しいアイテムを処理するように要求します。ハックは「スレッド」を行いませんが、同じことを非同期関数で表します
基本的に、最終的な目標は、標準の foreach ブロックを複数のスレッドで実行するようにすばやく最適化することです。そのため、コードの変更は最小限で済みます。また、ハックができることとその動作を確認することもできます。
サンプルとしていくつかのコードを思いつきましたが、完全に間違っていると思います。
class ArrayWalkAsync
{
protected $array;
protected $threads = Array();
protected $current_index = 0;
protected $max_index;
protected $threads = 4;
public function array_walk($array)
{
$this->array = $array;
$this->max_index = count($array) - 1;
$result = Array();
for ($i=0;$i<$this->threads;$i++)
{
$this->threads[] = new ArrayWalkThread();
}
$continue = true;
while($continue)
{
$awaitables = Array();
for ($i=0;$i<$this->threads;$i++)
{
$a = $this->proccesNextItem($i);
if ($a)
{
$this->threads[] = $a;
} else {
$continue = false;
}
}
// wait for each
foreach ($awaitables as $awaitable_i)
{
await awaitable_i;
// do something with the result
}
}
}
protected function proccesNextItem($thread_id)
{
if ($this->current_index > $this->max_index)
{
return false;
}
$a = new ArrayWalkItem();
$a->value = $this->array[$this->current_index];
$a->index = $this->current_index;
$this->current_index++;
return $this->threads[$thread_id]->process($a,$this);
}
public function processArrayItem($item)
{
$value = $item->value;
sleep(1);
$item->result = 1;
}
}
class ArrayWalkThread
{
async function process($value,$parent): Awaitable<?ArrayWalkItem>
{
$parent->processArrayItem($a);
}
}
class ArrayWalkItem
{
public $value;
public $result;
}