当前位置: 首页 > 后端技术 > PHP

并行加速脚本任务编写总结(协程)

时间:2023-03-30 03:45:54 PHP

1、环境准备php7.3/8+swoole4.6+2、示例代码Coroutine\run(function()use($db_work,$db_process){$connPool=newPDOPool((newPDOConfig)->withHost($db_work['host'])->withPort(3306)//->withUnixSocket('/tmp/mysql.sock')->withDbName($db_work['database'])->withCharset('utf8mb4')->withUsername($db_work['user'])->withPassword($db_work['password']));$processPool=newPDOPool((newPDOConfig)->withHost($db_process['host'])->withPort(3306)//->withUnixSocket('/tmp/mysql.sock')->withDbName($db_process['database'])->withCharset('utf8mb4')->withUsername($db_process['user'])->withPassword($db_process['密码']));$channel=newChannel(60);$conn=$connPool->get();$data1=$conn->query('SELECTcount(*)FROM`goods_images`WHEREimage_url!=\'\'')->fetchAll(PDO::FETCH_NUM);$data2=$conn->query('SELECTcount(*)FROM`goods_sku`WHEREoriginal_img!=\'\'ANDis_delete=0')->fetchAll(PDO::FETCH_NUM);$data3=$conn->query('SELECTcount(*)FROM`goods_spu`WHEREoriginal_img!=\'\'ANDis_delete=0')->fetchAll(PDO::FETCH_NUM);$connPool->put($conn);$goods_images_total=$data1[0][0];$goods_sku_total=$data2[0][0];$goods_spu_total=$data3[0][0];$todo=['goods_images'=>$goods_images_total,'goods_sku'=>$goods_sku_total,'goods_spu'=>$goods_spu_total,];print_r($todo);Coroutine::create(function()use($channel,$todo){foreach($todoas$table=>$total){$page=0;//第一页开始while($page++<=$total){$channel->push(['page'=>$page,'table'=>$table]);}}});Coroutine::create(function()use($channel,$connPool,$processPool){while(1){$data=$channel->pop(10);如果($data){$page=$data['page'];$table=$data['table'];//todoecho($page.'<==taskcompletedok'.PHP_EOL);}else{if($channel->isEmpty()){echo'images$channel:empty'.PHP_EOL;休息;}}}});});A。分析建立可以独立运行的最小单元。异步瓶颈mysql也是用到了连接池。连接池的容量应该大于协程任务池的容量。使用mysql连接池时,注意“借还”,$conn=$connPool->get();$connPool->put($conn);b。排队需求参数,使用channel.push发送参数加快执行速度,比如秒杀处理,就应该使用队列。C。使用channel.pop接收参数,提供cell执行协程池添加使用保持一致