2015-12-02 41 views
1

我对posix线程非常新颖,我需要从函数内部启动和管理线程,这可能吗?从函数内部启动线程

我读过github上的例子,它们非常有帮助,但我仍然无法实现解决方案。

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

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

无论何时需要使用任务,RabbitMQ都会调用函数或类方法(我指定)。

此代码已被简化,以便其更容易阅读

为了证明我已经安装和工作并行线程,这个工程:

<?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最好吗?

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

+0

是的,这是可能的,否则将不会执行任何进程! –

+0

'''use($ workers)'''似乎缺少了......目前,当控制离开Closure时'''workers''被销毁,这会破坏WorkerThread包含... –

+0

我已经实现了'$ callback = function($ msg)use($ workers)'但我得到了相同的结果 - 所有的逻辑运行,但仍然不是并行的。 –

回答

0

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

+0

嗯.........没有。 –

+0

不是吗?你能详细说明吗? – SOFe