Это многопоточность ? ))

Discussion in 'PHP' started by Велемир, 27 Mar 2009.

  1. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    PHP:

    <?php

        $urls 
    = array();
        
    $urls[0] = "http://www.wiw.ru";
        
    $urls[1] = "http://www.google.ee";
        
    $urls[2] = "http://www.google.ee";
        
    $urls[3] = "http://www.google.ee";
        
    $urls[4] = "http://www.google.ee";
        
    $urls[5] = "http://www.google.ee";
        
    $urls[6] = "http://www.google.ee";
       
        
    $mh curl_multi_init();

        foreach (
    $urls as $i => $url) {
          
    $conn[$i] = curl_init(trim($url));
          
    curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER1);
          
    curl_multi_add_handle ($mh,$conn[$i]);
        }

        
    // start performing the request
        
    do {
          
    $mrc curl_multi_exec($mh$active);
        } while (
    $mrc == CURLM_CALL_MULTI_PERFORM);

        while (
    $active and $mrc == CURLM_OK) {
          
    // wait for network
          
    if (curl_multi_select($mh) != -1) {
                    
    // pull in any new data, or at least handle timeouts
                    
    do {
                  
    $mrc curl_multi_exec($mh$active);
                    } while (
    $mrc == CURLM_CALL_MULTI_PERFORM);
          }
        }

        if (
    $mrc != CURLM_OK) {
          print 
    "Curl multi read error $mrc\n";
        }

        
    // retrieve data
        
    foreach ($urls as $i => $url) {
          if ((
    $err curl_error($conn[$i])) == '') {
                    
    $res[$i]=curl_multi_getcontent($conn[$i]);
          } else {
                    print 
    "Curl error on handle $i$err\n";
          }
          
    curl_multi_remove_handle($mh,$conn[$i]);
          
    curl_close($conn[$i]);
        }
       
        
    curl_multi_close($mh);

        
    print_r($res);

    ?>

    Погуглил и решил проверить.Вроде работает,но не отображается ничего таск менеджере.Это и есть многопоточность,или же это иллюзии?)
     
  2. wildshaman

    wildshaman Elder - Старейшина

    Joined:
    16 Apr 2008
    Messages:
    478
    Likes Received:
    483
    Reputations:
    99
    Это мультикурл, запросы выполняются параллельно. По идее это многопоточность,но, насколько я знаю, в многопоточности нет. поправьте, если не так.
     
  3. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Как понять нет ?) Выигрыш-то есть какой-то ? =_=,ибо другое я не осилил.
     
  4. wildshaman

    wildshaman Elder - Старейшина

    Joined:
    16 Apr 2008
    Messages:
    478
    Likes Received:
    483
    Reputations:
    99
    Выигрыш есть, бузксловно. Так скрипт проходится сразу по 10 линкам, а не по очереди
     
  5. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Ммм... Я вместо foreach() поставил цикл из for и решил выводить значение $mrc в первом цикле do while.Почему выводит -1?

    $conn[$i] = curl_init(trim($urls[0]));

    ЗЫ: Я это делал для того,чтобы один и тот же линк открыть n-ое число раз или послать n-ое число раз запрос.
     
    #5 Велемир, 27 Mar 2009
    Last edited: 27 Mar 2009
  6. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Проблему решил простой конструкцией:

    for($i=0;$i<100;$i++) {

    $urls[] = $urls[0];

    }

    Чет заранее не дошло...
     
  7. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Многопоточность - когда потоки идут ПАРАЛЕЛЬНО. А в твоем случае - цикл. Т.е. поток за потоком, т.е. ПОСЛЕДОВАТЕЛЬНО. Это НЕ многопоточность!
     
  8. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    ок, а давай тогда пример языка, поддерживающего многопоточность, только сделай запуск потоков одновременно ;)
     
  9. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    .bat
    Запускаешь, н.п. несколько брутов дедов =)
    +статья была на ачате о многопоточности в пхп.
     
  10. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Java к примеру. Или питон(с небольшим отступлением на GIL). Или C#.

    Потоки будут работать одновременно. и обладать выжным свойством: shared state.
     
  11. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    :) юмора не поняли. вопрос был не о параллельном выполнении, а об одновременном запуске, т.е. не последовательном запуске
    Code:
    Thread t1 =new Thread(new ThreadStart(obj.dowork));
    Thread t2 =new Thread(new ThreadStart(obj.dowork));
    t1.start();
    t2.start();
    
    потоки выполняются параллельно, но запускаются то последовательно.
     
    3 people like this.
  12. Zedi

    Zedi Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    316
    Likes Received:
    120
    Reputations:
    13
    Многопоточность в PHP обещают в 7 версии, еще 6 толком не вышла, так что еще долго будут появляться такие темы, многопоточность это далеко не то.
     
  13. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Может случиться, что запустятся они одновременно. Вот схема:

    Поток 1 запусекает потоки 2 и 3. Поток 2 запускает поток 4, поток 5 запускает поток 5.
    Если отбросить синхронизацию менеджера потоков - то они запустятся одновременно.
     
    1 person likes this.
  14. Zedi

    Zedi Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    316
    Likes Received:
    120
    Reputations:
    13
    А потоки по моему везде последовательно запускаются, например тот ж ИПД брут, там видно это