Perl - насчёт многопоточности.

Discussion in 'PHP' started by GenTao, 8 Nov 2009.

  1. GenTao

    GenTao New Member

    Joined:
    10 Oct 2009
    Messages:
    123
    Likes Received:
    2
    Reputations:
    -3
    :).Наткнулся в каком-то блоге на скрипт:

    PHP:

    #!/usr/bin/perl -w

    use threads;


    my @threads;

    @
    threads

    for my $i (1..3) {

      
    push @threadsthreads->create(\&get_now$i);

    }


    foreach 
    my $thread (@threads) {

        
    $thread->join();

    }


    sub get_now

    {

        
    my $num shift;
        print 
    "thread "$num" => "time(), "\n";
        
    sleep 1;

    }


    Теперь вопросы:

    1) Что означает этот символ ?
    Code:
    ->
    2) Эм... Как отличить создаваемый объект от используемого метода (когда просматриваешь чужие скрипты).Может,я что не допонял ?

    3) В строчке my $num = shift; удаляются элементы массива @_,но что это за элементы такие ? Где они передавались в массив ?

    4) Зачем в процедуре get_now{} стоит оператор sleep ? Для задержки между созданием потоков или для чего ?
     
  2. Spyder

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

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    1) =\ наверно он вызывает метод из класса
    2) Что то я вопроса не понял
    3) Ну там скорее не массив передается, а переменная $i
    push @threads, threads->create(&get_now, $i);

    4) слип наверно для наглядности используется
     
  3. Spyder

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

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    cr0w, упс, я не читал твоего поста)
     
  4. GenTao

    GenTao New Member

    Joined:
    10 Oct 2009
    Messages:
    123
    Likes Received:
    2
    Reputations:
    -3
    Хмм)).Я так понял,sleep там вообще не нужен?)))
     
  5. cr0w

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

    Joined:
    11 Sep 2008
    Messages:
    92
    Likes Received:
    141
    Reputations:
    33
    Вообще, раз нашел это на чьем-то блоге, то у автора и спросил бы зачем ему sleep. Кстати, в скрипте явные ошибки, и работать оно не должно. Вот в таком виде должно работать (не на чем проверить мне щас было, правда, но должно :) ):
    Code:
     #!/usr/bin/perl
    
    use threads;
    use warnings;
    use strict; 
    
    my @threads;
    push @threads, threads->create(\&get_now, $_) for (1..10);
    $_->join() foreach @threads; 
    
    sub get_now { 
        my $num = shift;
        print 'thread ', $num, ' => ', time(), "\n";
    }
     
  6. GenTao

    GenTao New Member

    Joined:
    10 Oct 2009
    Messages:
    123
    Likes Received:
    2
    Reputations:
    -3
    Работает,но разве это многопоточность ? В процессах не видно,что количество потоков скрипта равно количеству заданных потоков.
     
  7. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    o_O Треды выполняются в рамках одного процесса. Нужна куча процессов - юзайте fork()
     
    1 person likes this.
  8. GenTao

    GenTao New Member

    Joined:
    10 Oct 2009
    Messages:
    123
    Likes Received:
    2
    Reputations:
    -3
    Не понял.Я и говорил про один процесс,а не про миллион.Я имел в виду,что еоличество потоков должно увеличиваться в рамках одного процесса (perl.exe - 50,например),или я не прав ?

    ЗЫ: До форка не дошёл ещё...
     
  9. GenTao

    GenTao New Member

    Joined:
    10 Oct 2009
    Messages:
    123
    Likes Received:
    2
    Reputations:
    -3
    Не ответят мне )
     
  10. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    На что? Многопоточен ли пример cr0w? Да, многопоточен. В процессах и не будет отображаться кол-во потоков (форки будут)