在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
呵呵哒, 项目情况: 要同步300W+的用户数据到qcloud,只能每次一个curl同步,大概每秒同步3个,算下来同步完300W数据估计要10天+,所以想到用多线程解决。 方案1: 用c++写多进程方案,fork多个进程出来解决。主线程负责读取/存储数据,子线程负责curl。
方案2: 用php写多进程方案,同方案1.主线程读取,子线程curl。 但是由于php没有多进程,不能直接操控线程/进程。所以只能依赖于linux来实现多进程。 php函数pcntl_fork()可以创建进程,等同于linux的fork。 和fork不同的是,pcntl_fork返回的0是子进程,返回的id是子进程的pid(而fork是父进程返回0,子进程返回ppid). 注意pcntl_fork()函数必须要在linux上面才行,据说要加载pcntl.so模块,但貌似不加载也行。
方案3: php+shell模拟多线程 例如:test.php文件实现了项目所需功能(包含数据库读写和curl) 再写一份shell如下,保存为start.sh: #!/bin/bash //指定bash,必须 for(( i=0; i<20; i++)) do php test.php & //执行test.php,&符号的意思是把该操作放在后台执行,这样shell就可以继续执行下一步sleep命令了。如果没有这个符号,shell会阻塞在这里。 sleep 1s done 最后执行该shell,sudo ./start.sh shell会启动20个进程同时分别执行test.php 但是由于每个进程都相当于主进程,所以共同的资源不好控制,这个case中,共同的资源只有数据库,所以每次操作数据库我都加锁详见我另一篇文章。mysql lock。 因为相对于数据库操作基本都是每秒能解决,而curl连续发个几百个需要几十秒甚至更多,所以数据库加锁影响不大。 |
2022-08-17
2022-11-06
2022-08-17
2022-07-18
2022-07-22
请发表评论