PDA

Просмотр полной версии : perl + потоки = геморой


genom--
15.01.2007, 23:07
use threads;


for(1..$thread){threads->create(\&brut);}

lol:
if($thread<10)
{threads->create(\&brut);sleep(2);goto(lol);}

sub brut {
$thread=$thread-1;
}



вот код сначала создаем потоки а потом периодически нужно проверять их колчество и если некоторые уже отработали то создавать новые -- но из подпроцесса нельзя изменить переменную находящуюся в осн цикле программы -- что делать??

nerezus
15.01.2007, 23:39
правильно спроектировать.

подскажу: потоки не должнны заканчиваться. Если поток сделал часть работы, то просто пусть берет следующую часть.
Хотя это обходной путь, но он легче ;)

genom--
15.01.2007, 23:42
хм а это идея -- хотя продолжение его работы возможно только с исзменение внешней переменной -- мой скрипт берет из массива пароли на проверку --- и нужно знать какие брать пароли каждому потоку -- следовательно смещать указатель в массиве

genom--
16.01.2007, 00:09
все ненадо уже

получилось так

use threads;
use threads::shared;
my $num : shared;

тогда переменную $num мона изменять откуда угодно

VeX
18.01.2007, 15:03
а не проще сделать многопоточность на форках?
преимущества:
1) функция fork() есть всегда
2) нет гемора как с модулям тредов
3) много готовых примеров

nerezus
18.01.2007, 15:08
Нет, не проще:
1) модули тоже
2) гемора намного меньше с тредами
3) аналогично

4) делать потоки через потоки - правильно
5) в тредах есть общие переменные

VeX
18.01.2007, 15:56
Нет, не проще:
1) модули тоже
не согласен: на многих хостингах специально убирают данный модуль

2) гемора намного меньше с тредами
на вкус и цвет, мне проще с форками.

3) аналогично
мне редко попадались, хз

4) делать потоки через потоки - правильно
правильно - это когда тебе удобно.


5) в тредах есть общие переменные
Эмм... а разве в форках нельзя юзать общие переменные?

nerezus
18.01.2007, 16:47
не согласен: на многих хостингах специально убирают данный модуль Так хостинги не для этого созданы.
Кстати и perl обычно скомпилен бывает без поддержки fork()

Эмм... а разве в форках нельзя юзать общие переменные? Что такое fork()? Это ветвление. Переменные будут разными.

KSURi
18.01.2007, 17:52
все ненадо уже

получилось так

use threads;
use threads::shared;
my $num : shared;

тогда переменную $num мона изменять откуда угодно
http://forum.antichat.ru/threadnav28020-2-10.html
последний пост + посмотри на дату