.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "AnyEvent::ForkManager 3pm" .TH AnyEvent::ForkManager 3pm "2020-06-13" "perl v5.30.3" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" AnyEvent::ForkManager \- A simple parallel processing fork manager with AnyEvent .SH "VERSION" .IX Header "VERSION" This document describes AnyEvent::ForkManager version 0.07. .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 3 \& use AnyEvent; \& use AnyEvent::ForkManager; \& use List::Util qw/shuffle/; \& \& my $MAX_WORKERS = 10; \& my $pm = AnyEvent::ForkManager\->new(max_workers => $MAX_WORKERS); \& \& $pm\->on_start(sub { \& my($pm, $pid, $sec) = @_; \& printf "start sleep %2d sec.\en", $sec; \& }); \& $pm\->on_finish(sub { \& my($pm, $pid, $status, $sec) = @_; \& printf "end sleep %2d sec.\en", $sec; \& }); \& \& my @sleep_time = shuffle(1 .. 20); \& foreach my $sec (@sleep_time) { \& $pm\->start( \& cb => sub { \& my($pm, $sec) = @_; \& sleep $sec; \& }, \& args => [$sec] \& ); \& } \& \& my $cv = AnyEvent\->condvar; \& \& # wait with non\-blocking \& $pm\->wait_all_children( \& cb => sub { \& my($pm) = @_; \& print "end task!\en"; \& $cv\->send; \& }, \& ); \& \& $cv\->recv; .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\f(CW\*(C`AnyEvent::ForkManager\*(C'\fR is much like Parallel::ForkManager, but supports non-blocking interface with AnyEvent. .PP Parallel::ForkManager is useful but, it is difficult to use in conjunction with AnyEvent. Because Parallel::ForkManager's some methods are blocking the event loop of the AnyEvent. .PP You can accomplish the same goals without adversely affecting the Parallel::ForkManager to AnyEvent::ForkManager with AnyEvent. Because AnyEvent::ForkManager's methods are non-blocking the event loop of the AnyEvent. .SH "INTERFACE" .IX Header "INTERFACE" .SS "Methods" .IX Subsection "Methods" \fI\f(CI\*(C`new\*(C'\fI\fR .IX Subsection "new" .PP This is constructor. .IP "max_workers" 4 .IX Item "max_workers" max parallel forking count. (default: 10) .IP "on_start" 4 .IX Item "on_start" started child process callback. .IP "on_finish" 4 .IX Item "on_finish" finished child process callback. .IP "on_error" 4 .IX Item "on_error" fork error callback. .IP "on_enqueue" 4 .IX Item "on_enqueue" If push to start up child process queue, this callback is called. .IP "on_dequeue" 4 .IX Item "on_dequeue" If shift from start up child process queue, this callback is called. .IP "on_working_max" 4 .IX Item "on_working_max" If request to start up child process and process count equal max process count, this callback is called. .PP Example .IX Subsection "Example" .PP .Vb 11 \& my $pm = AnyEvent::ForkManager\->new( \& max_workers => 2, ## default 10 \& on_finish => sub { ## optional \& my($pid, $status, @anyargs) = @_; \& ## this callback call when finished child process.(like AnyEvent\->child) \& }, \& on_error => sub { ## optional \& my($pm, @anyargs) = @_; \& ## this callback call when fork failed. \& }, \& ); .Ve .PP \fI\f(CI\*(C`start\*(C'\fI\fR .IX Subsection "start" .PP start child process. .IP "args" 4 .IX Item "args" arguments passed to the callback function of the child process. .IP "cb" 4 .IX Item "cb" run on child process callback. .PP Example .IX Subsection "Example" .PP .Vb 7 \& $pm\->start( \& cb => sub { ## optional \& my($pm, $job_id) = @_; \& ## this callback call in child process. \& }, \& args => [$job_id],## this arguments passed to the callback function \& ); .Ve .PP \fI\f(CI\*(C`wait_all_children\*(C'\fI\fR .IX Subsection "wait_all_children" .PP You can call this method to wait for all the processes which have been forked. This can wait with blocking or wait with non-blocking in event loop of AnyEvent. \&\fBfeature to wait with blocking is \s-1ALPHA\s0 quality till the version hits v1.0.0. Things might be broken.\fR .IP "blocking" 4 .IX Item "blocking" If this parameter is true, blocking wait enable. (default: false) \&\fBfeature to wait with blocking is \s-1ALPHA\s0 quality till the version hits v1.0.0. Things might be broken.\fR .IP "cb" 4 .IX Item "cb" finished all the processes callback. .PP Example .IX Subsection "Example" .PP .Vb 6 \& $pm\->wait_all_children( \& cb => sub { ## optional \& my($pm) = @_; \& ## this callback call when finished all child process. \& }, \& ); .Ve .PP \fI\f(CI\*(C`signal_all_children\*(C'\fI\fR .IX Subsection "signal_all_children" .PP Sends signal to all worker processes. Only usable from manager process. .PP \fI\f(CI\*(C`on_error\*(C'\fI\fR .IX Subsection "on_error" .PP As a new method's argument. .PP \fI\f(CI\*(C`on_start\*(C'\fI\fR .IX Subsection "on_start" .PP As a new method's argument. .PP \fI\f(CI\*(C`on_finish\*(C'\fI\fR .IX Subsection "on_finish" .PP As a new method's argument. .PP \fI\f(CI\*(C`on_enqueue\*(C'\fI\fR .IX Subsection "on_enqueue" .PP As a new method's argument. .PP \fI\f(CI\*(C`on_dequeue\*(C'\fI\fR .IX Subsection "on_dequeue" .PP As a new method's argument. .PP \fI\f(CI\*(C`on_working_max\*(C'\fI\fR .IX Subsection "on_working_max" .PP As a new method's argument. .SH "DEPENDENCIES" .IX Header "DEPENDENCIES" Perl 5.8.1 or later. .SH "BUGS" .IX Header "BUGS" All complex software has bugs lurking in it, and this module is no exception. If you find a bug please either email me, or add the bug to cpan-RT. .SH "SEE ALSO" .IX Header "SEE ALSO" AnyEvent AnyEvent::Util Parallel::ForkManager Parallel::Prefork .SH "AUTHOR" .IX Header "AUTHOR" Kenta Sato .SH "LICENSE AND COPYRIGHT" .IX Header "LICENSE AND COPYRIGHT" Copyright (c) 2012, Kenta Sato. All rights reserved. .PP This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.