首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用多线程运行PHP (tesseract)

使用多线程运行PHP (tesseract)
EN

Stack Overflow用户
提问于 2016-08-10 21:43:23
回答 3查看 373关注 0票数 1

我需要通过tesseract发送一些图像,为了节省时间,我想并行运行tesseract,最多可运行6个实例。

我已经看过这个问题了,但是我真的不知道如何写代码

How can one use multi threading in PHP applications

从数据库中获取所有图像,并将结果与与图像相关的其余信息一起写回数据库中的特定行

有人能链接到一个例子,或者有人能写一个关于如何做这项工作的快速例子吗?

当一个进程完成时,必须启动一个新的进程,所以总是有多达6个进程同时运行?

更新

代码语言:javascript
代码运行次数:0
运行
复制
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 ...');
EN

回答 3

Stack Overflow用户

发布于 2016-08-10 22:07:42

不要这样做。PHP对多线程的支持真的很糟糕。相反,请使用多进程。使用proc_open & co。-- http://php.net/manual/en/function.proc-open.php

票数 0
EN

Stack Overflow用户

发布于 2016-08-10 22:11:26

您不需要使用多线程。要运行6个工作进程,而不需要与父进程同步-您可以使用proc_open

多线程更快,占用的资源更少(它没有单独的命名空间),你可以比work多运行4倍,但多线程需要用非ZTS构建PHP (一些扩展不能与非ZTS一起工作),并且需要一些你能理解的pthread模型。

举个例子:

我们使用proc_open创建了6个worker,并使用基础进程侦听孩子(我使用我的包装器,使用Ev或事件库或不使用它们) (child-processes),也许你会喜欢包装器reactphp (child-processes)

代码语言:javascript
代码运行次数:0
运行
复制
    $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或其他不同的队列。你的进程永远不会死,倒下的进程会被监督者抬起来。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
$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不是完全排队的。

  1. It not save message
  2. react / zmq使用EventLib,所以实际上我的示例是zmq

您需要使用Gearman或RabbitMQ -您的任务具有理想的功能

尊敬的格言

票数 0
EN

Stack Overflow用户

发布于 2016-08-20 23:56:03

我写了一个例子(基于child-processes)。这应该可以解决您的问题:

这是parent.php:

代码语言:javascript
代码运行次数:0
运行
复制
$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 (我添加了示例输出,您需要删除它):

代码语言:javascript
代码运行次数:0
运行
复制
$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

尊敬的格言

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38875197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档