<?php //========== 启动线程① ==========// $task = static function (string $name, string $gender, int $age): void { echo "俺叫{$name}({$gender}),今年{$age}岁。" . PHP_EOL; }; $argv = ['张三', '男', 18]; $future1 = parallel\run($task, $argv); // 俺叫张三(男),今年18岁。 //========== 启动线程② ==========// $future2 = parallel\run(static function (string $name, string $gender, int $age): void { echo "俺叫{$name}({$gender}),今年{$age}岁。" . PHP_EOL; }, ['李四', '女', 17]); // [root@localhost ~]# /program/php/bin/php /inetpub/wwwroot/parallel/demo.php // [root@localhost ~]# 俺叫张三(男),今年18岁。 // [root@localhost ~]# 俺叫李四(女),今年17岁。 // [root@localhost ~]#
<?php $id = 'parallel-1'; parallel\run(static function (string $id): void { $counter = 0; // 每1秒钟在当前目录下生成一个名为“parallel.*.tmp”的文件,最多生成10个文件 while (true) { if ($counter > 9) { break; } $file = "$id.$counter.tmp"; $size = file_put_contents(__DIR__ . "/$file", ''); if ($size !== false) { echo "{$id}生成文件[$file]成功" . PHP_EOL; } else { echo "{$id}生成文件[$file]失败" . PHP_EOL; } $counter++; sleep(1); } echo "线程任务($id)已完成" . PHP_EOL; }, [$id]); echo "线程任务($id)已启动" . PHP_EOL; $id = 'parallel-2'; parallel\run(static function (string $id): void { $counter = 0; // 每1秒钟在当前目录下生成一个名为“parallel.*.tmp”的文件,最多生成10个文件 while (true) { if ($counter > 9) { break; } $file = "$id.$counter.tmp"; $size = file_put_contents(__DIR__ . "/$file", ''); if ($size !== false) { echo "{$id}生成文件[$file]成功" . PHP_EOL; } else { echo "{$id}生成文件[$file]失败" . PHP_EOL; } $counter++; sleep(1); } echo "线程任务($id)已完成" . PHP_EOL; }, [$id]); echo "线程任务($id)已启动" . PHP_EOL; // [root@localhost ~]# /program/php/bin/php /inetpub/wwwroot/parallel/demo.php // 线程任务(parallel-1)已启动 // 线程任务(parallel-2)已启动 // parallel-2生成文件[parallel-2.0.tmp]成功 // parallel-1生成文件[parallel-1.0.tmp]成功 // parallel-2生成文件[parallel-2.1.tmp]成功 // parallel-1生成文件[parallel-1.1.tmp]成功 // parallel-2生成文件[parallel-2.2.tmp]成功 // parallel-1生成文件[parallel-1.2.tmp]成功 // parallel-2生成文件[parallel-2.3.tmp]成功 // parallel-1生成文件[parallel-1.3.tmp]成功 // parallel-1生成文件[parallel-1.4.tmp]成功 // parallel-2生成文件[parallel-2.4.tmp]成功 // parallel-1生成文件[parallel-1.5.tmp]成功 // parallel-2生成文件[parallel-2.5.tmp]成功 // parallel-1生成文件[parallel-1.6.tmp]成功 // parallel-2生成文件[parallel-2.6.tmp]成功 // parallel-1生成文件[parallel-1.7.tmp]成功 // parallel-2生成文件[parallel-2.7.tmp]成功 // parallel-2生成文件[parallel-2.8.tmp]成功 // parallel-1生成文件[parallel-1.8.tmp]成功 // parallel-2生成文件[parallel-2.9.tmp]成功 // parallel-1生成文件[parallel-1.9.tmp]成功 // 线程任务(parallel-1)已完成 // 线程任务(parallel-2)已完成 // [root@localhost ~]# //========== 总结 ==========// // 1、使用线程执行任务并不是把任务扔到后台执行然后程序立即退出,而是任务并发执行不会产生阻塞,程序必须等所有线程任务执行完了才会退出, // 也就是说如果某个线程任务里面有死循环且没有退出条件,那么程序将会永远执行下去不会退出。
Copyright © 2024 码农人生. All Rights Reserved