我对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最好吗?
我意识到这可能是一个非常初学者的问题,也许是一个坏问题,但任何帮助,非常感谢。
是的,这是可能的,否则将不会执行任何进程! –
'''use($ workers)'''似乎缺少了......目前,当控制离开Closure时'''workers''被销毁,这会破坏WorkerThread包含... –
我已经实现了'$ callback = function($ msg)use($ workers)'但我得到了相同的结果 - 所有的逻辑运行,但仍然不是并行的。 –