从函数

时间:2015-12-02 19:12:26

标签: php multithreading pthreads

我对posix线程很新,我需要帮助从函数中启动和管理线程,这可能吗?

我已经阅读了github上的示例,它们非常有用,但我仍然无法实现解决方案。

https://github.com/krakjoe/pthreads/tree/master/examples

我有逻辑,不断向RabbitMQ添加任务。然后我有逻辑,消耗这些任务并运行它们。我想使用pthreads并行运行它们 - 因此每次将任务添加到rabbitmq时,线程立即开始处理它。

每当有任务被消耗时,RabbitMQ都会调用函数或类方法(我指定)。

此代码已简化,因此更易于阅读

为了证明我安装了pthread并正常工作,这有效:

<?php
$workers = [];
foreach (range(0, 5) as $i) {
    $workers[$i] = new WorkerThread($i);
    $workers[$i]->start();
}

这不起作用:

<?php
$workers = [];
$callback = function($msg)
{
    $i = $msg->uniqueKey;
    $workers[$i] = new WorkerThread($i, $msg);
    $workers[$i]->start();
};
$channel->basic_consume('queue', '', false, true, false, false, $callback );

我的问题是我无法从函数中初始化并启动一个线程并让它们并行运行。

我也尝试过直接启动线程而不必调用该函数。但这不起作用,因为我必须调用start方法,并且不能这样做并发送其他参数,即使我可以通过覆盖该方法并调用那将是一个巨大的黑客:

$channel->basic_consume('queue', '', false, true, false, false, [ new WorkerThread(), 'start' ] );

如何使用函数或方法启动pthreads是最好的?

我意识到这可能是一个非常初学的问题,也许是一个糟糕的问题,但是非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用全局变量。函数内部的更改将在函数结束后变为垃圾,除非它是全局变量。