ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1251  
Старый 26.10.2009, 01:32
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

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

PS: Перечитал весь топик, серьезно, похожая проблема была у .Slip, но с точностью до наоборот - у меня тут афигенная асинхронность, но нарушается очередь записи, а надо по порядку. Надеюсь на вас, античатовцы

Последний раз редактировалось Pashkela; 26.10.2009 в 05:06..
 
Ответить с цитированием

  #1252  
Старый 26.10.2009, 07:52
krypt3r
Познавший АНТИЧАТ
Регистрация: 27.04.2007
Сообщений: 1,044
Провел на форуме:
3660186

Репутация: 905


По умолчанию

Юзать хэш и затем отсортировать его по ключам
 
Ответить с цитированием

  #1253  
Старый 26.10.2009, 13:51
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

это-то понятно, выше мы рассмотрели пример ретурна числа, и возвращали через массив, а как сделать ретурн хеша из multithread функции без предварительных его записывания в массив-посредник? Чтобы вернуть чистый хеш с ключами с результатами работы всех потоков, помеченными ключиками и, соотвественно, легко разбирающимися. Спасибо.

Последний раз редактировалось Pashkela; 26.10.2009 в 13:54..
 
Ответить с цитированием

  #1254  
Старый 26.10.2009, 14:00
krypt3r
Познавший АНТИЧАТ
Регистрация: 27.04.2007
Сообщений: 1,044
Провел на форуме:
3660186

Репутация: 905


По умолчанию

Заполняем хэш и делаем в конце функции
Код:
return \%myhash;
 
Ответить с цитированием

  #1255  
Старый 26.10.2009, 14:10
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

Код:
#!/usr/bin/perl
use threads;
use threads::shared;
my $n : shared;

$a = gets();
print $_, "\n" for @$a;
#print $a . "\n";

sub gets {
  $thr = 10;
  $n = 0;
  for(0..$thr) {
    $trl[$_] = threads->create(\&gets1);
  }
  for(0..$thr) {
    $res[$_] = $trl[$_]->join;
  }
  sub gets1 {
    $| = 1;
    $ii = "";
    while ($n < 10) {
      { lock($n);
      $n++; }
      $ii .= $n;
      $hash{$n} = $ii;
      #print $ii . "\n";
    }
    #print $ii, "\n";
    return \%hash
  }
  return \@res;
}
Относительно кода выше - как вернуть хеш, не так же ведь. И надо ли его шарить в мультитреде. Т.е. нужно, чтобы ключи у хеша были именно как в коде выше = $n. Только так потом можно будет идентифицировать данные

Последний раз редактировалось Pashkela; 26.10.2009 в 14:13..
 
Ответить с цитированием

  #1256  
Старый 26.10.2009, 14:36
krypt3r
Познавший АНТИЧАТ
Регистрация: 27.04.2007
Сообщений: 1,044
Провел на форуме:
3660186

Репутация: 905


По умолчанию

Ну если юзать расшаренный хэш, то
Код:
#!/usr/bin/perl                 
use threads;                    
use threads::shared;            
my $n : shared;                 
my %hash : shared = ();         
#my $refhash : shared = \%hash; 

$a = gets();
print $_, ' => ', $hash{$_}, "\n" for keys %hash;

sub gets {
  $thr = 10;
  $n = 0;
  %res = ();
  for(0..$thr) {
    $trl[$_] = threads->create(\&gets1);
  }
  for(0..$thr) {
    $trl[$_]->join;
  }
  sub gets1 {
    $| = 1;
    $ii = "";
    while ($n < 10) {
      { lock($n);
      $n++; }
      $ii .= $n;
      $hash{$n} = $ii;
    }
  }
}
 
Ответить с цитированием

  #1257  
Старый 26.10.2009, 14:41
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

спасибо, только чото не пойму - нет ретурна, что такое %res = (); и какую функцию несет

Но это то, что надо, так или иначе!!!! Сенкс большое
 
Ответить с цитированием

  #1258  
Старый 26.10.2009, 14:56
krypt3r
Познавший АНТИЧАТ
Регистрация: 27.04.2007
Сообщений: 1,044
Провел на форуме:
3660186

Репутация: 905


По умолчанию

%res = (); - это пустой хэш )
Ретурны я убрал, т.к. хэш расшаренный и возвращать как бы ничего не надо. А вот пример без использования шарного хэша и с ретурнами
Код:
#!/usr/bin/perl               
use threads;                  
use threads::shared;          
my $n : shared;               

$a = gets();
print $_, ' => ', $a->{$_}, "\n" for sort {$a <=> $b} keys %$a;
#print $a . "\n";

sub gets {
  $thr = 10;
  $n = 0;
  %res = ();
  for(0..$thr) {
    $trl[$_] = threads->create(\&gets1);
  }
  for(0..$thr) {
    #$res[$_] = $trl[$_]->join;
    %res = (%res, %{$trl[$_]->join});
    #print $n, "\n";
  }
  sub gets1 {
    $| = 1;
    $ii = "";
    while ($n < 10) {
      { lock($n);
      $n++; }
      $ii .= $n;
      $hash{$n} = $ii;
      #print $ii . "\n";
    }
    #print $ii, "\n";
    return \%hash
  }
  return \%res;
}
 
Ответить с цитированием

  #1259  
Старый 26.10.2009, 15:09
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
Провел на форуме:
9220514

Репутация: 3338


Отправить сообщение для Pashkela с помощью ICQ
По умолчанию

Великолепно! Оба варианта рабочие. Чем один лучше или хуже другого? Шара больше памяти жрет при большом потоке или ...?
 
Ответить с цитированием

  #1260  
Старый 27.10.2009, 05:07
GenTao
Участник форума
Регистрация: 10.10.2009
Сообщений: 133
Провел на форуме:
143706

Репутация: -1
По умолчанию

PHP код:

my 
@fuck = (1..10);
my @= (18,19);

sub shit {

my(@x,@y) = @_;
print @
x."\r\n";
print @
y."\r\n";

}

shit(@fuck,@s);

system("PAUSE"); 
Выводит 12,0.Хотел вывести значения обоих массивов...
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[php] Новичкам: задаем вопросы _Great_ PHP, PERL, MySQL, JavaScript 16396 17.06.2010 21:19
[c/c++] Новичкам: задаем вопросы _Great_ С/С++, C#, Delphi, .NET, Asm 5420 17.06.2010 13:33
Вопросы по Ipb 2.0 Voodoo_People Форумы 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ