Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странное поведение threads и Queue в Win32 и Linux 
V
    Опции темы
AlexPet
Дата 8.7.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Берем пример по нитям с intuit.ru:
Код

use threads;       # подключить средства
use Thread::Queue; # и модуль работы с очередью

my $data_queue = Thread::Queue->new; # создаем очередь
my $thread = threads->new(\&reader); # и нить
# помещаем в очередь скалярные данные:
$data_queue->enqueue(1987);               # число
$data_queue->enqueue('год');              # строку
$data_queue->enqueue('рождения', 'Perl'); # список
$thread->join; # ожидаем окончания нити 
exit;          # перед завершением программы

sub reader {   # извлекаем данные из очереди,
   while ($data_queue->pending) { # пока она не пуста
      my $data_element = $data_queue->dequeue;
      print "'$data_element' извлечен из очереди\n";
   } 
}

Так вот, при запуске в MSWin32 все нормально, в стандартный поток вывода будет послано
Цитата

'1987' извлечен из очереди
'год' извлечен из очереди
'рождения' извлечен из очереди
'Perl' извлечен из очереди


Однако, при запуске в Линуксе (2.6.24-gentoo-r8), на выходе ничего не будет. Тем не менее, если мы строку 
Код

my $thread = threads->new(\&reader);

перенесем пониже, уже после занесения в очередь данных, то вывод будет аналогичен примеру выше.

Такое ощущение, что нить отрабатывает раньше, чем в очередь были занесены данные, однако же нить должна (?) ждать метода join или detach... Не подскажете, в чем дело?
PM MAIL ICQ Jabber   Вверх
sir_nuf_nuf
Дата 8.7.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(AlexPet @  8.7.2008,  15:53 Найти цитируемый пост)
Такое ощущение, что нить отрабатывает раньше, чем в очередь были занесены данные

очень правильное ощущение. так и есть. 


Цитата(AlexPet @  8.7.2008,  15:53 Найти цитируемый пост)
однако же нить должна (?) ждать метода join или detach

нет, созданная нить не должна. Она отрабатывает и все. Ждать должна основная нить.

А работать по разному может даже на одной ОС.
Тут дело в алгоритме schedulerа. У линукса есть такая фичи - при создании нового потока/процесса - предпочтение отдается ему.. Уже не помню зачем так сделано. В виндовс, видимо, нет. 

Локальное решение:
используйте семафор для синхронизации, или какую-нть shared-переменную - флажок.

P.S. потоки в perl - не самое надежное средство. Если нужно написать что то надежное - то лучше писать на процессах (и/или) POE


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
AlexPet
Дата 8.7.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



sir_nuf_nuf, благодарю за подробное разъяснение! Догадывался, что дело в разницу в ядре ОС, но про планировщик (scheduler) не знал.

Цитата(sir_nuf_nuf @  8.7.2008,  17:22 Найти цитируемый пост)
Если нужно написать что то надежное - то лучше писать на процессах (и/или) POE

"на процессах" - имеется в виду fork() ? Тяжеловато получится, наверное.

А вообще да, наслышан про POE, но еще не приходилось применять. Послушал на YAPC 2008 про него, там было тааакое количество инфы в единицу времени, что мне стало немного не по себе  smile 
PM MAIL ICQ Jabber   Вверх
ginnie
Дата 8.7.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый sir_nuf_nuf, наверное не POE, а событийную машину (event-driven programming)?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
AlexPet
Дата 8.7.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Кстати, раз уж заговорили о событийных машинах - не подскажете, с чего начать?
А то POE кажется уж больно навороченной и (по отзывам) медленной.
Хотелось бы чего-нибудь сходного с threads, но более предсказуемо себя ведущего smile
PM MAIL ICQ Jabber   Вверх
ginnie
Дата 8.7.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



AlexPet, предлагаю взять реальную задачу и попробовать EV. Быстрее EV врядли что-нибудь найдете. По сравлению с POE у EV один недостаток - многое надо будет написать своими руками  smile После овладения EV многое в POE станет понятным и можно будет делать выводы в отношении выбора той или иной событийной машины.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
AlexPet
Дата 8.7.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



ginnie, спасибо за совет! Нужно же с чего-то начинать smile

PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0690 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.