Size: a a a

2020 December 19

АК

Алексей Клименко... in use Perl or die;
Алексей Клименко
Эм-м…

say 'START';
my $cond = AnyEvent->condvar;
$SIG{INT} = sub {
 say "Ctrl+C";
 $cond->send;
};
my $signal = AnyEvent->signal( signal => 'INT', cb => sub {
 say "INT recvd";
 $cond->send;
});
$cond->recv;
say 'EXIT';


Вот так внезапно работает, только с задержкой в 8-10 секунд после отправки Ctrl+C.
Что?
Кто проверит, у всех задержка?
источник

АК

Алексей Клименко... in use Perl or die;
Из юзов у меня только

use utf8;
use strict;
use warnings;
use Modern::Perl;
use AnyEvent;
источник

a

allter in use Perl or die;
мне кажется, тогда проще оставить $SIG{INT}, но $cond->recv заменить на более сложную конструкцию с таймерами. Просто что бы крутился евентлуп.
источник

a

allter in use Perl or die;
> The maximum time a signal might be delayed is 10 seconds by default, but can be overriden via $ENV{PERL_ANYEVENT_MAX_SIGNAL_LATENCY} or $AnyEvent::MAX_SIGNAL_LATENCY - see the "ENVIRONMENT VARIABLES" section for details.

вот это ещё читал?
источник

АК

Алексей Клименко... in use Perl or die;
allter
> The maximum time a signal might be delayed is 10 seconds by default, but can be overriden via $ENV{PERL_ANYEVENT_MAX_SIGNAL_LATENCY} or $AnyEvent::MAX_SIGNAL_LATENCY - see the "ENVIRONMENT VARIABLES" section for details.

вот это ещё читал?
Нет!
источник

АК

Алексей Клименко... in use Perl or die;
$AnyEvent::MAX_SIGNAL_LATENCY = 1;

РАБОТАЕТ
источник

a

allter in use Perl or die;
Короче, попробуй так:
BEGIN { $ENV{PERL_ANYEVENT_MAX_SIGNAL_LATENCY} //= 1 }
use AnyEvent;
say 'START';
my $cond = AnyEvent->condvar;
my $signal = AnyEvent->signal( signal => 'INT', cb => sub {
 say "INT recvd";
 $cond->send;
});
$cond->recv;
say 'EXIT';
источник

a

allter in use Perl or die;
Алексей Клименко
$AnyEvent::MAX_SIGNAL_LATENCY = 1;

РАБОТАЕТ
ура :)
источник

VG

Vadim Goncharov in use Perl or die;
allter
Короче, попробуй так:
BEGIN { $ENV{PERL_ANYEVENT_MAX_SIGNAL_LATENCY} //= 1 }
use AnyEvent;
say 'START';
my $cond = AnyEvent->condvar;
my $signal = AnyEvent->signal( signal => 'INT', cb => sub {
 say "INT recvd";
 $cond->send;
});
$cond->recv;
say 'EXIT';
а BEGIN зачем?
источник

a

allter in use Perl or die;
там один обработчик надо оставить (эниэвентовский)
источник

VG

Vadim Goncharov in use Perl or die;
allter
там один обработчик надо оставить (эниэвентовский)
боюсь, так не сработает :)
источник

АК

Алексей Клименко... in use Perl or die;
allter
ура :)
Он в signal тоже приходит, если SIG-блока нет, но как-то «позже», что ли.

Оставлю оба блока, пусть хоть кто-то выполнится, я всё равно там только булев флаг собрался ставить (чтобы все промисы и коллбеки выскочили с undef вместо результата).
источник

a

allter in use Perl or die;
Vadim Goncharov
а BEGIN зачем?
Что бы точно успеть до инициализации евентлупа.
В общем, в зависимости от конкретного приложения можно просто расставить где надо.
источник

a

allter in use Perl or die;
Алексей Клименко
Он в signal тоже приходит, если SIG-блока нет, но как-то «позже», что ли.

Оставлю оба блока, пусть хоть кто-то выполнится, я всё равно там только булев флаг собрался ставить (чтобы все промисы и коллбеки выскочили с undef вместо результата).
Там есть нюанс с любыми обработчиками сигналов в Perl.
Перловый код по умолчанию не выполнится, пока управление находится в сишной либе. Есть возможность вызвать безусловно, но это считается неправильным и будет неприятно взаимодействовать с евентлупом
источник

VG

Vadim Goncharov in use Perl or die;
allter
Там есть нюанс с любыми обработчиками сигналов в Perl.
Перловый код по умолчанию не выполнится, пока управление находится в сишной либе. Есть возможность вызвать безусловно, но это считается неправильным и будет неприятно взаимодействовать с евентлупом
виндовый AE по умолчанию луп на pure perl крутит, и даже не уверен, что умеет другие
источник

a

allter in use Perl or die;
поэтому правильно пользоваться AE`шным обработчиком сигнала + вот эту настройку latency выставлсять
источник

a

allter in use Perl or die;
Vadim Goncharov
виндовый AE по умолчанию луп на pure perl крутит, и даже не уверен, что умеет другие
но он же там не busy wait делает?
источник

VG

Vadim Goncharov in use Perl or die;
allter
но он же там не busy wait делает?
select() зовёт
источник

VG

Vadim Goncharov in use Perl or die;
и еще какие-то костыли
источник

VG

Vadim Goncharov in use Perl or die;
я читал как-то его код, там в комментариях microshi windoze - самое мягкое ругательство
источник