Giả sử tôi có một số tác vụ trong một ứng dụng có thể hoàn thành theo bất kỳ thứ tự nào. Và tôi cần chạy một số mã khi tất cả các tác vụ đã hoàn thành. Nếu điều đó quan trọng, ứng dụng đang chạy dưới AnyEvent, nhưng không có Coro.Gọi lại ghép kênh
Ở một mức độ nào đó, AnyEvent 's $cv->begin/$cv->end
cho phép những gì tôi muốn. Tuy nhiên, tôi muốn có sự kiểm soát chi tiết hơn. Ví dụ, tôi muốn không thể "hoàn thành" một nhiệm vụ hai lần. Khả năng thu thập dữ liệu từ tất cả các nhiệm vụ cũng sẽ tốt đẹp.
Tất nhiên, điều này có thể được thực hiện. Thiết lập nhiều callback chia sẻ một hash; xóa các khóa khỏi băm đó bất cứ khi nào một tác vụ kết thúc; gọi megacallback khi băm rỗng. Tôi tự hỏi nếu có một cách văn minh hơn để làm điều đó, có thể một số mô-đun CPAN?
Ví dụ: đây là API tưởng tượng sẽ đáp ứng nhu cầu của tôi.
#!/usr/bin/perl -w
use strict;
use Some::Module;
# Set goals
my $cb = Some::Module->new(sub { say 'BOOM!' });
$cb->begin(qw(foo bar));
# Much later, as tasks start getting done
$cb->end(foo => 42); # "return" value from task 'foo'
$cb->begin('baz'); # can add more tasks, why not
$cb->end('bar'); # just finish task 'bar'
# still waiting for 'baz' to finish at this point
# Finally, last hanging task is done
$cb->end(baz => 137); # BOOM!
# at this point, sub {}->({ foo=>42, bar=>undef, baz=>137 })
# has been called
Xem thêm perlmonks question.
Có điều gì giống như thế này?
MergePoint là * chính xác * những gì tôi đã yêu cầu, cảm ơn. – Dallaylaen
Tương lai có vẻ đầy hứa hẹn. Cảm ơn một lần nữa. Tôi ước tôi có thể upvote hai lần. – Dallaylaen