… | |
… | |
328 | $proc->[0] |
328 | $proc->[0] |
329 | or --$nidle; |
329 | or --$nidle; |
330 | |
330 | |
331 | Array::Heap::splice_heap_idx @pool, $proc->[1] |
331 | Array::Heap::splice_heap_idx @pool, $proc->[1] |
332 | if defined $proc->[1]; |
332 | if defined $proc->[1]; |
|
|
333 | |
|
|
334 | @$proc = 0; # tell others to leave it be |
333 | }; |
335 | }; |
334 | |
336 | |
335 | $want_start = sub { |
337 | $want_start = sub { |
336 | undef $stop_w; |
338 | undef $stop_w; |
337 | |
339 | |
… | |
… | |
356 | }; |
358 | }; |
357 | |
359 | |
358 | $scheduler = sub { |
360 | $scheduler = sub { |
359 | if (@queue) { |
361 | if (@queue) { |
360 | while (@queue) { |
362 | while (@queue) { |
|
|
363 | @pool or $start_worker->(); |
|
|
364 | |
361 | my $proc = $pool[0]; |
365 | my $proc = $pool[0]; |
362 | |
366 | |
363 | if ($proc->[0] < $load) { |
367 | if ($proc->[0] < $load) { |
364 | # found free worker, increase load |
368 | # found free worker, increase load |
365 | unless ($proc->[0]++) { |
369 | unless ($proc->[0]++) { |
… | |
… | |
383 | or $want_stop->(); |
387 | or $want_stop->(); |
384 | |
388 | |
385 | Array::Heap::adjust_heap_idx @pool, $proc->[1] |
389 | Array::Heap::adjust_heap_idx @pool, $proc->[1] |
386 | if defined $proc->[1]; |
390 | if defined $proc->[1]; |
387 | |
391 | |
|
|
392 | &$ocb; |
|
|
393 | |
388 | $scheduler->(); |
394 | $scheduler->(); |
389 | |
|
|
390 | &$ocb; |
|
|
391 | }); |
395 | }); |
392 | } else { |
396 | } else { |
393 | $want_start->() |
397 | $want_start->() |
394 | unless @pool >= $max; |
398 | unless @pool >= $max; |
395 | |
399 | |
… | |
… | |
513 | having only one worker is best, for example, when you read or write big |
517 | having only one worker is best, for example, when you read or write big |
514 | files at maixmum speed, as a second worker will increase seek times. |
518 | files at maixmum speed, as a second worker will increase seek times. |
515 | |
519 | |
516 | =back |
520 | =back |
517 | |
521 | |
|
|
522 | =head1 EXCEPTIONS |
|
|
523 | |
|
|
524 | The same "policy" as with L<AnyEvent::Fork::RPC> applies - exceptins will |
|
|
525 | not be caught, and exceptions in both worker and in callbacks causes |
|
|
526 | undesirable or undefined behaviour. |
|
|
527 | |
518 | =head1 SEE ALSO |
528 | =head1 SEE ALSO |
519 | |
529 | |
520 | L<AnyEvent::Fork>, to create the processes in the first place. |
530 | L<AnyEvent::Fork>, to create the processes in the first place. |
521 | |
531 | |
522 | L<AnyEvent::Fork::RPC>, which implements the RPC protocol and API. |
532 | L<AnyEvent::Fork::RPC>, which implements the RPC protocol and API. |