zoukankan      html  css  js  c++  java
  • php多线程

    呵呵哒,

    项目情况:

    要同步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连续发个几百个需要几十秒甚至更多,所以数据库加锁影响不大。

  • 相关阅读:
    【hdu2825-Wireless Password】AC自动机+DP
    kuangbin专题十二 HDU1029 Ignatius and the Princess IV (水题)
    Codeforces Round #501 (Div. 3) 1015D Walking Between Houses
    Codeforces Round #501 (Div. 3) 1015A Points in Segments (前缀和)
    POJ2503 Babelfish
    POJ2531 Network Saboteur
    POJ3278 Catch That Cow
    POJ2488 A Knight's Journey
    POJ2456 Aggressive cows
    HDU1425 A Chess Game
  • 原文地址:https://www.cnblogs.com/alazalazalaz/p/5363777.html
Copyright © 2011-2022 走看看