Ответы пользователя по тегу Perl
  • Как организовать очередь потоков?

    @Rozello
    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    use threads;
    use threads::shared;
    
    # Создаём расшареную переменную
    my @numbers:shared = (1..100);
    
    # Задаём количество потоков
    my $threads = shift || 10;
    
    # Создаём потоки и кладём их обекты в массив
    my @threads;
    for (1..$threads) {
        push @threads, threads->new(
            sub {
                while (@numbers) {
                    # Достаём данные из массива
                    # Предварительно заблокировава его для остальных потоков
                    my $number;
                    {
                        # Блокировка работает только в этом скоупе
                        lock(@numbers);
                        $number = shift(@numbers);
                    }
                    
                    print 'Result: '.($number*10)."\n";
                }
            }
        );
    }
    
    # Запускаем потоки привязав их к основному процессу
    $_->join for (@threads);
    Ответ написан
    Комментировать
  • Вызов сторонней программы из perl скрипта

    @Rozello
    Я бы выполнил fork + exec
    Ответ написан
    Комментировать
  • Как организовать многопоточную обработку массива в Perl?

    @Rozello
    Создавать и убивать потоки, это плохая идея, нужно создавать потоки обрабатывающие массив в цикле, пока он не опустеет.
    То есть массив используется как очередь.
    Но потоки это беда, имхо.

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    use threads;
    use threads::shared;
    
    # Создаём расшареную переменную
    my @numbers:shared = (1..100);
    
    # Задаём количество потоков
    my $threads = shift || 10;
    
    # Создаём потоки и кладём их обекты в массив
    my @threads;
    for (1..$threads) {
        push @threads, threads->new(
            sub {
                while (@numbers) {
                    # Достаём данные из массива
                    # Предварительно заблокировава его для остальных потоков
                    my $number;
                    {
                        # Блокировка работает только в этом скоупе
                        lock(@numbers);
                        $number = shift(@numbers);
                    }
                    
                    print 'Result: '.($number*10)."\n";
                }
            }
        );
    }
    
    # Запускаем потоки привязав их к основному процессу
    $_->join for (@threads);
    Ответ написан
    Комментировать
  • Как реализовать потоки в Perl?

    @Rozello
    Судя по задаче, могу сказать что наверное вам имеет смысл посмотреть в сторону модуля Coro, иначе ваши потоки будут жрать ресурсы как ненормальные.
    Ответ написан
    Комментировать
  • На каком ЯП лучше реализовать небольшое приложение для работы с веб-данными?

    @Rozello
    Неоднократно решал подобные задачи при помощи Perl + LWP::UserAgent(https://metacpan.org/pod/LWP::UserAgent).
    Ответ написан
    Комментировать
  • Парсинг ip с 2ip на perl?

    @Rozello
    #!/usr/bin/env perl
    
    # Включаем варнинги и ужесточение синтаксиса
    use strict;
    use warnings;
    
    # Включаем библиотеку для работы с http
    use LWP::Simple;
    
    # Качаем страницу, если не удалось пркращаем работу
    my $page = get('http://2ip.ru/') or die "Can't get page!";
    
    # Парсим IP ргуляркой если не удалось прекращаем работу
    my ($ip) = ($page =~ m!(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})!) or die "Can't pars IP!";
    
    # Выводим IP
    print 'You IP: '.$ip."\n";
    Ответ написан
    Комментировать