LINUX.ORG.RU

perl и многопоточность


1

0

Кому-нибудь доводилось иметь с этим дело? Есть мысль немножко подкрутить существующий код и возможно получить на этом некоторый выигрыш. Но слышал, что у perl (не знаю, в контексте определенной операционки или вообще) с этим все не очень хорошо. В общем, если у кого есть хоть какой-то опыт работы - поделитесь соображениями плз. С указанием оси конечно.


основная проблема с тредами в перле - они на самом деле не шарят дату. вся дата копируется на этапе создания треда. =(

asgard
()
Ответ на: комментарий от asgard

есть возможность шарить данные Thread::shared но это не главная проблема под никсами используется юзерлевелтреад модель то есть через форк порождаются не нити, а процессы

before
()
Ответ на: комментарий от roller

>давно это делал, но вроде...

"вроде" не считается. тяжелые треды в перле(сказали уже выше)

лучше сразу сделать архитектуру приложения "типа" PostgreSQL

AcidumIrae ★★★★★
()
Ответ на: комментарий от roller

в винде нету fork() в стандартном понимании там пораждается нить

before
()
Ответ на: комментарий от AcidumIrae

1.pl:
use threads;

sub runner {
my $num = shift;
my $i = 1;
while(1) {
print "Thread " . $num . " iteration " . $i++ . "\n";

}
}

my $thread = threads->create(\&runner, 1);
my $thread2 = threads->create(\&runner, 2);

$s = <>;

--------------

roller@avatar:~/tmp$ perl 1.pl

Видим:
Thread 1 iteration 1
Thread 2 iteration 1
Thread 1 iteration 2
Thread 2 iteration 2
Thread 1 iteration 3
Thread 2 iteration 3
Thread 1 iteration 4
Thread 2 iteration 4
...


-----------------
На другой консоли:
roller@avatar:~/tmp$ ps ax

видим:
ps ax10175 ? S 0:00 [pdflush]
10289 pts/3 Sl+ 0:00 perl 1.pl
10292 pts/5 R+ 0:00 ps ax


Процесс всего один. Т.е. все же thread а не fork.

А уж тяжелое там или нет, хз. Мне хватало.

roller ★★★
()
Ответ на: комментарий от roller

дададада :) расскажите еще :)))

вы что-то потяжелее "хело ворлд" запустите. там к примеру систему управлением виртуализации в кластере на пару мег, а потом рассазівайте сказки ;)

AcidumIrae ★★★★★
()
Ответ на: комментарий от AcidumIrae

что вам еще рассказать?
Процесс - один? Один.

А вообще у в доке четко написанно что ихние threads это ихние threads. И они не такие как в POSIX, java green threads, и т.д.

roller ★★★
()

Имхо, лучше не надо. В перловых тредах столько "особенностей реализации", что проще тупо форкаться и общаться через shared mem/потоки - по крайней мере, оно понятным способом работает.

anonymous
()
Ответ на: комментарий от anonymous

Бубу. А как же ограничение на количество процессов? Представляю если какой нить юзер захочет форкнется раз 500, скажем если рекурсивно сайт скачивать потоками.

anonymous
()
Ответ на: комментарий от anonymous

> Бубу. А как же ограничение на количество процессов? Представляю если 
> какой нить юзер захочет форкнется раз 500, скажем если рекурсивно 
> сайт скачивать потоками.

Если вы утыкаетесь в лимиты на процессы - то у вас неправильный дизайн, и переход с процессов на треды вас не спасет.

В частности, рекурсивное скачивание кодом типа

sub process($) {
    $url = shift;
    $doc = get($url);
    foreach my $link (get_links($doc, $url)) {
        if (fork() == 0) { process($link); exit(); }
    }
}

не является хорошей идеей.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.