zoukankan      html  css  js  c++  java
  • swoole进程-2

    --------进程通讯 场景  父子进程通讯

    https://wiki.swoole.com/wiki/page/214.html

    <?php
    
    
    use SwooleProcess;
    
    echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID
    cli_set_process_title("mymain"); //设置了进程名称
    
    
    $child1=new Process(function(Process $p){
        while(true){
            sleep(1);
            $p->write("[进程1:12345]");
            echo "进程1发送数据:[进程1:12345]".PHP_EOL;
        }
    },false,1,true);
    $child1->start();
    
    $child2 = new Process(function(Process $p){
        while(true){
    //        usleep(0.5*1000*1000);
            sleep(0.5);
            echo "进程2获取数据:".$p->read().PHP_EOL;
    
        }
    });
    $child2->start();
    
    while(true){
        $child1_data = $child1->read();
        $child2->write($child1_data);
        sleep(1);
    }
    
    
    Process::signal(SIGCHLD, function($sig) {
        //必须为false,非阻塞模式
        while($ret =  Process::wait(false)) {
            var_dump($ret);
        }
    });
    [root@bogon swoole]# php7  ./poll.php
    当前进程ID:2409
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]
    进程1发送数据:[进程1:12345]
    进程2获取数据:[进程1:12345]

    队列queue

    <?php
    
    
    use SwooleProcess;
    
    echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID
    cli_set_process_title("mymain"); //设置了进程名称
    
    
    $child1=new Process(function(Process $p){
        while(true){
            sleep(3);
            for($i = 0 ;$i<=5;$i++){
                $p->push($i);
            }
        }
    },false,1,true);
    $child1->useQueue(1,2);
    $child1->start();
    
    $child2 = new Process(function(Process $p){
        while(true){
            sleep(0.5);
            echo "进程2获取数据:".$p->pop().PHP_EOL;
    
        }
    },false,1,true);
    $child2->useQueue(1);
    $child2->start();
    
    $child3 = new Process(function(Process $p){
        while(true){
            sleep(0.5);
            echo "进程3获取数据:".$p->pop().PHP_EOL;
    
        }
    },false,1,true);
    $child3->useQueue(1);
    $child3->start();
    
    
    Process::signal(SIGCHLD, function($sig) {
        //必须为false,非阻塞模式
        while($ret =  Process::wait(false)) {
            var_dump($ret);
        }
    });
    [root@bogon swoole]# php7  ./poll.php
    当前进程ID:2735
    进程2获取数据:0
    进程2获取数据:2
    进程2获取数据:3
    进程2获取数据:4
    进程2获取数据:5
    进程3获取数据:1
    进程2获取数据:0
    进程2获取数据:2
    进程2获取数据:3
    进程2获取数据:4
    进程2获取数据:5
    进程3获取数据:1
    进程2获取数据:0
    进程2获取数据:2
    进程2获取数据:3
    进程2获取数据:4
    进程2获取数据:5
    进程3获取数据:1
    进程2获取数据:0
    进程2获取数据:2
    进程2获取数据:3
    进程2获取数据:4
    进程2获取数据:5
    进程3获取数据:1

    执行 外部程序

    <?php
    require "vendor/autoload.php";
    use SwooleProcess;
    use SwooleCoroutineMysql as MySQL;
    echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID
    cli_set_process_title("mymain"); //设置了进程名称
    
    
    $child1=new Process(function(Process $p){
    
        $p->exec("/application/php7/bin/php",['./test.php']);
    },true,0,true);
    $child1->start();
    
    while(true){
        $ret=$child1->read();
        echo $ret;
        usleep(0.5*1000*1000);
    }
    
    
    Process::signal(SIGCHLD, function($sig) {
        //必须为false,非阻塞模式
        while($ret =  Process::wait(false)) {
            //var_dump($ret);
        }
    });

    crontab表达式

    <?php
    date_default_timezone_set('PRC'); //设置中国时区
    require_once 'vendor/autoload.php';
    
    
    $config=[
        "job1"=>[
            "cron"=> CronCronExpression::factory('* * * * *'),
            "func"=>function(){
                echo "job1".date("Y-m-d h:i").PHP_EOL;
            },
            "current"=>date("Y-m-d H:i"),
            "nth"=>0
        ]
    ];
    while(true){
    
        foreach($config as $key=>&$value){
            $cron=$value["cron"];
            $func=$value["func"];
            $current=$value["current"];
            $nth=$value['nth'];
            $time=$cron->getNextRunDate($value["current"],$nth,false)->getTimestamp()-strtotime(date("Y-m-d H:i"));
            if($time===0){
                //执行业务逻辑
                $func();
                $value['nth']=$value['nth']+1;
            }
        }
    
    
        sleep(1);
    }
    View Code

    多进程创建任务并回收

    <?php
    use SwooleProcess;
    
    cli_set_process_title("mymaster");
    $manger = new Process(function(Process $process){
        cli_set_process_title("mymanager");
        while(true){
            sleep(0.1);
            $process->write(json_encode(["a"=>123,"b"=>456]));
            Process::kill(posix_getppid(),SIGUSR1);
        }
    },false,1);
    
    $manger->start();
    
    
    Process::signal(SIGUSR1, function($sig) use($manger) {
        $data[] = $manger->read();
        $child=new Process(function(Process $process) use($data){
            sleep(1);
            echo $data.PHP_EOL;
        });
        $child->start();
    });
    
    Process::signal(SIGCHLD, function($sig) {
        //必须为false,非阻塞模式
        while($ret =  Process::wait(false)) {
            //var_dump($ret);
        }
    });

    上述代码 无法会不断开启进程执行任务  需要新方案改进

    swoole4.4.x之后子进程回收代码的问题处理:

  • 相关阅读:
    【STM32F429】第11章 ThreadX中断优先级配置,含BasePri配置方案
    【STM32H7】第10章 ThreadX任务栈大小确定及其溢出检测
    【STM32F429】第10章 ThreadX任务栈大小确定及其溢出检测
    《安富莱嵌入式周报》第216期:2021.06.07--2021.06.13
    嵌入式新闻早班车-第3期
    嵌入式新闻早班车-第2期
    Keil Studio已经确定为MDK下一代开发工具,更多功能将在今年年底上线
    嵌入式新闻早班车-第1期
    【STM32H7的DSP教程】第32章 STM32H7的实数FFT的逆变换(支持单精度和双精度)
    【STM32F429的DSP教程】第32章 STM32F429的实数FFT的逆变换(支持单精度和双精度)
  • 原文地址:https://www.cnblogs.com/sunlong88/p/11487270.html
Copyright © 2011-2022 走看看