PDA

Просмотр полной версии : Perl - насчёт многопоточности.


GenTao
08.11.2009, 04:33
:).Наткнулся в каком-то блоге на скрипт:



#!/usr/bin/perl -w

use threads;


my @threads;

@threads

for my $i (1..3) {

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

}


foreach my $thread (@threads) {

$thread->join();

}


sub get_now

{

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

}




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

1) Что означает этот символ ? ->

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

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

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

Spyder
08.11.2009, 04:56
1) =\ наверно он вызывает метод из класса
2) Что то я вопроса не понял
3) Ну там скорее не массив передается, а переменная $i
push @threads, threads->create(&get_now, $i);

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

Spyder
08.11.2009, 04:57
cr0w, упс, я не читал твоего поста)

GenTao
08.11.2009, 17:26
Хмм)).Я так понял,sleep там вообще не нужен?)))

cr0w
08.11.2009, 18:39
Хмм)).Я так понял,sleep там вообще не нужен?)))
Вообще, раз нашел это на чьем-то блоге, то у автора и спросил бы зачем ему sleep. Кстати, в скрипте явные ошибки, и работать оно не должно. Вот в таком виде должно работать (не на чем проверить мне щас было, правда, но должно (: ):
#!/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";
}

GenTao
09.11.2009, 04:58
Работает,но разве это многопоточность ? В процессах не видно,что количество потоков скрипта равно количеству заданных потоков.

krypt3r
09.11.2009, 08:17
o_O Треды выполняются в рамках одного процесса. Нужна куча процессов - юзайте fork()

GenTao
09.11.2009, 17:14
Не понял.Я и говорил про один процесс,а не про миллион.Я имел в виду,что еоличество потоков должно увеличиваться в рамках одного процесса (perl.exe - 50,например),или я не прав ?

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

GenTao
11.11.2009, 21:12
Не ответят мне )

krypt3r
11.11.2009, 23:04
На что? Многопоточен ли пример cr0w? Да, многопоточен. В процессах и не будет отображаться кол-во потоков (форки будут)