gpt4 book ai didi

PHP - 使用 pthreads 的多线程函数

转载 作者:行者123 更新时间:2023-12-03 13:19:38 24 4
gpt4 key购买 nike

我目前正在使用 pthreads 在一个非常苛刻的功能上实现多线程。到目前为止,我得到了这个工作:

class Operation extends Thread {
public function __construct($arg) {
$this->arg = $arg;
}
public function run() {
if ($this->arg) {
$parameters = $this->arg;
echo my_function($parameters[0],$parameters[1]);
}
}
}
$stack = array();
foreach ($work as $operation) { $stack[] = new Operation($operation); };
foreach ($stack as $t) { $t->start(); };

它直接输出结果。
我想让我的结果一个一个地存储在一个数组中(以相同的顺序会很好),但当然这不起作用:
class Operation extends Thread {
public function __construct($arg) {
$this->arg = $arg;
}
public function run() {
if ($this->arg) {
$parameters = $this->arg;
$results[] = my_function($parameters[0],$parameters[1]);
}
}
}
$stack = array();
foreach ($work as $operation) { $stack[] = new Operation($operation); };
foreach ($stack as $t) { $t->start(); };
var_dump($results);

任何帮助,将不胜感激。

细节:
  • my_function 输出一个 UTF-8 字符串。
  • 最佳答案

    基本问题是数组不是线程安全的,pthreads 在所有 Threaded 对象上都提供了类似数组的接口(interface);这意味着您可以在多线程上下文中使用线程对象代替数组。

    <?php

    function demanding(...$params) {
    /* you have parameters here */
    return array(rand(), rand());
    }

    class Task extends Collectable {
    public function __construct(Threaded $result, $params) {
    $this->result = $result;
    $this->params = $params;
    }

    public function run() {
    $this->result[] =
    demanding(...$this->params);
    }

    protected $result;
    protected $params;
    }

    $pool = new Pool(16);

    $result = new Threaded();

    while (@$i++<16) {
    $pool->submit(
    new Task($result, $argv));
    }

    $pool->shutdown();

    var_dump($result);
    ?>

    没有内置的方法来进行多线程排序,所以最简单的方法是在线程完成后对结果进行排序。

    关于PHP - 使用 pthreads 的多线程函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30575403/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com