我需要通过tesseract发送一些图像,为了节省时间,我想并行运行tesseract,最多可运行6个实例。
我已经看过这个问题了,但是我真的不知道如何写代码
How can one use multi threading in PHP applications
从数据库中获取所有图像,并将结果与与图像相关的其余信息一起写回数据库中的特定行
有人能链接到一个例子,或者有人能写一个关于如何做这项工作的快速例子吗?
当一个进程完成时,必须启动一个新的进程,所以总是有多达6个进程同时运行?
更新
class Command {
private $descriptorspec;
private $output = '';
public function __construct(){
$this->descriptorspec = [
0 => ['pipe', 'r'], // stdin
1 => ['pipe', 'w'], // stdout
2 => ['pipe', 'w'], // stderr
];
}
public function output(): string{
return $this->output;
}
public function exec(string $syntax): string{
$process = proc_open($syntax, $this->descriptorspec, $pipes);
$this->output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
proc_close($process);
return $stderr;
}
}
$Cmd = new Command;
$Cmd->exec('tesseract ...');
发布于 2016-08-10 14:07:42
不要这样做。PHP对多线程的支持真的很糟糕。相反,请使用多进程。使用proc_open & co。-- http://php.net/manual/en/function.proc-open.php
发布于 2016-08-10 14:11:26
您不需要使用多线程。要运行6个工作进程,而不需要与父进程同步-您可以使用proc_open
多线程更快,占用的资源更少(它没有单独的命名空间),你可以比work多运行4倍,但多线程需要用非ZTS构建PHP (一些扩展不能与非ZTS一起工作),并且需要一些你能理解的pthread模型。
举个例子:
我们使用proc_open创建了6个worker,并使用基础进程侦听孩子(我使用我的包装器,使用Ev或事件库或不使用它们) (child-processes),也许你会喜欢包装器reactphp (child-processes)
$child = new ChildProcesses();
$child->add('<system command>');
$child->add('<system command>');
$child->add('<system command>');
$child->add('<system command>');
$child->add('<system command>');
$fails = $child->check(null, function(ChildProcess $process) {
echo 'Error with chld process';
});
或者使用pthread阅读官方文档。您需要在非ZTS中重新编译PHP,并安装pthread扩展。对于您的问题,我将使用Pool
您需要查看此页面中的第一个示例Pool pthreads
更新:
如果你需要所有的时间--6个工人。您需要创建六个监听器。进程之间的通信使用zmq或rabbitmq、gearman或其他不同的队列。你的进程永远不会死,倒下的进程会被监督者抬起来。
例如:
$loop = Factory::create();
$context = new Context($loop));
$context->getSocket(\ZMQ::SOCKET_SUB);
$context->connect($host);
$context->subscribe('you_queue');
$context->on('messages', function($messages){
// get specific data and run operation
});
$loop->run();
注意,zmq不是完全排队的。
您需要使用Gearman或RabbitMQ -您的任务具有理想的功能
尊敬的格言
发布于 2016-08-20 15:56:03
我写了一个例子(基于child-processes)。这应该可以解决您的问题:
这是parent.php:
$child = new ChildProcesses();
$child->addProcessInstance(new \TkachInc\ChildProcesses\ChildProcess('php worker.php -w1'));
$child->addProcessInstance(new \TkachInc\ChildProcesses\ChildProcess('php worker.php -w2'));
$child->addProcessInstance(new \TkachInc\ChildProcesses\ChildProcess('php worker.php -w3'));
$child->addProcessInstance(new \TkachInc\ChildProcesses\ChildProcess('php worker.php -w4'));
$child->addProcessInstance(new \TkachInc\ChildProcesses\ChildProcess('php worker.php -w5'));
$child->addProcessInstance(new \TkachInc\ChildProcesses\ChildProcess('php worker.php -w6'));
$child->daemon();
和您的worker.php (我添加了示例输出,您需要删除它):
$options = getopt("w:");
if(isset($options['w']))
{
echo $options['w'].PHP_EOL;
switch ($options['w'])
{
case "1":
sleep(5);
break;
case "2":
sleep(5);
break;
case "3":
sleep(7);
break;
case "4":
sleep(5);
break;
case "5":
sleep(7);
break;
case "6":
sleep(5);
break;
}
}
// your logic to receive from database and write to database
尊敬的格言
https://stackoverflow.com/questions/38875197
复制