Пытаюсь разобраться с Coro::Handle.
Нужно параллельно/асинхронно читать два файла.
Вот минимальный проблемный код:
#!/usr/bin/perl
use strict;
use warnings;
use Coro;
use Coro::Handle;
my $coro_1 = async {
open my $fh, '<', "/etc/passwd" or die "$!";
$fh = unblock $fh;
for ( 1 .. 2 ) {
print "coro_1 start\n";
my $result = $fh->readline();
print "coro_1 finish: " . length($result) . "\n";
}
};
my $coro_2 = async {
open my $fh, '<', "/etc/passwd" or die "$!";
$fh = unblock $fh;
for ( 1 .. 2 ) {
print " coro_2 start\n";
my $result = $fh->readline();
print " coro_2 finish: " . length($result) . "\n";
}
};
$coro_1->join;
$coro_2->join;
print "END\n";
Здесь создаются два треда, в каждом построчно читается файл. Я понимаю так - при каждом вызове readline управление должно передаваться в другой тред. Соответственно, работать треды должны поочередно.
Но у меня сначала отрабатывает один тред, потом другой. Т.е. такое ощущение, что readline блокируется и не передает управление в другой тред.
Вот вывод:
coro_1 start
coro_1 finish: 32
coro_1 start
coro_1 finish: 48
coro_2 start
coro_2 finish: 32
coro_2 start
coro_2 finish: 48
END
Хорошо видно, что сначала отработал первый тред (левая колонка), потом второй тред (правая колонка).
А вот как должно бы быть (если я ничего не напутал):
coro_1 start
coro_2 start
coro_1 finish: 32
coro_1 start
coro_2 finish: 32
coro_2 start
coro_1 finish: 48
coro_2 finish: 48
END
Почему у меня работает не параллельно/асинхронно? Что я упустил?
_italic_
→ italic
**bold**
→ bold
[PP](http://pragmaticperl.com)
→
<http://pragmaticperl.com>
→
module:Plack
→
release:URI
→
author:VTI
→
`my $foo = 'bar'`
```
my $multi;
$line;
```