多线程编程·parallel\Runtime的使用

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);


// 子线程任务函数
$task = static function (string $name, string $gender, int $age): void {
    if (class_exists('Human1')) {
        echo 'Human1类存在' . PHP_EOL;
        $human1 = new Human1($name, $gender, $age);
        $human1->profile();
    } else {
        echo 'Human1类不存在' . PHP_EOL;
    }

    if (class_exists('Human2')) {
        echo 'Human2类存在' . PHP_EOL;
        $human2 = new Human2($name, $gender, $age);
        $human2->profile();
    } else {
        echo 'Human2类不存在' . PHP_EOL;
    }
};


// 启动子线程(1)
$runtime1 = new parallel\Runtime(__DIR__ . '/Human1.class.php');
$runtime1->run($task, ['张三', '男', 18]);


// 休眠3秒钟再启动一个子线程
sleep(3);
echo '……(休眠3秒后)……' . PHP_EOL;


// 启动子线程(2)
$runtime2 = new parallel\Runtime(__DIR__ . '/Human2.class.php');
$runtime2->run($task, ['李四', '女', 17]);


//========== 控制台输出·开始 ==========//

// Human1.class.php >> 若看到这句话则说明子线程已引入Human1类
// Human1类存在
// Human1::profile()  俺叫张三(男),今年18岁。
// Human2类不存在
// ……(休眠3秒后)……
// Human2.class.php >> 若看到这句话则说明子线程已引入Human2类
// Human1类不存在
// Human2类存在
// Human2::profile()  俺叫李四(女),今年17岁。

//========== 控制台输出·结束 ==========//


//========== 总结 ==========//
// 1、parallel\Runtime()的效果和parallel\bootstrap()很像,都是引入一个PHP文件来初始化子线程的运行环境,不同点在于parallel\Runtime()是
//    针对单个子线程,而parallel\bootstrap()是针对所有子线程。
// 2、一般来说无脑使用parallel\bootstrap()即可,因为parallel\Runtime()更像是一次性用品,而并发编程恰恰要多次使用相同的子线程运行环境。

Copyright © 2024 码农人生. All Rights Reserved