… | |
… | |
89 | |
89 | |
90 | use Guard (); |
90 | use Guard (); |
91 | use Array::Heap (); |
91 | use Array::Heap (); |
92 | |
92 | |
93 | use AnyEvent; |
93 | use AnyEvent; |
|
|
94 | # explicit version on next line, as some cpan-testers test with the 0.1 version, |
|
|
95 | # ignoring dependencies, and this line will at least give a clear indication of that. |
94 | use AnyEvent::Fork; # we don't actually depend on it, this is for convenience |
96 | use AnyEvent::Fork 0.6; # we don't actually depend on it, this is for convenience |
95 | use AnyEvent::Fork::RPC; |
97 | use AnyEvent::Fork::RPC; |
96 | |
98 | |
97 | # these are used for the first and last argument of events |
99 | # these are used for the first and last argument of events |
98 | # in the hope of not colliding. yes, I don't like it either, |
100 | # in the hope of not colliding. yes, I don't like it either, |
99 | # but didn't come up with an obviously better alternative. |
101 | # but didn't come up with an obviously better alternative. |
… | |
… | |
446 | to this function are effectively read-only - modifying them after the call |
448 | to this function are effectively read-only - modifying them after the call |
447 | and before the callback is invoked causes undefined behaviour. |
449 | and before the callback is invoked causes undefined behaviour. |
448 | |
450 | |
449 | =cut |
451 | =cut |
450 | |
452 | |
|
|
453 | =item $cpus = AnyEvent::Fork::Pool::ncpu [$default_cpus] |
|
|
454 | |
|
|
455 | =item ($cpus, $eus) = AnyEvent::Fork::Pool::ncpu [$default_cpus] |
|
|
456 | |
|
|
457 | Tries to detect the number of CPUs (C<$cpus> often called cpu cores |
|
|
458 | nowadays) and execution units (C<$eus>) which include e.g. extra |
|
|
459 | hyperthreaded units). When C<$cpus> cannot be determined reliably, |
|
|
460 | C<$default_cpus> is returned for both values, or C<1> if it is missing. |
|
|
461 | |
|
|
462 | For normal CPU bound uses, it is wise to have as many worker processes |
|
|
463 | as CPUs in the system (C<$cpus>), if nothing else uses the CPU. Using |
|
|
464 | hyperthreading is usually detrimental to performance, but in those rare |
|
|
465 | cases where that really helps it might be beneficial to use more workers |
|
|
466 | (C<$eus>). |
|
|
467 | |
|
|
468 | Currently, F</proc/cpuinfo> is parsed on GNU/Linux systems for both |
|
|
469 | C<$cpus> and C<$eu>, and on {Free,Net,Open}BSD, F<sysctl -n hw.ncpu> is |
|
|
470 | used for C<$cpus>. |
|
|
471 | |
|
|
472 | Example: create a worker pool with as many workers as cpu cores, or C<2>, |
|
|
473 | if the actual number could not be determined. |
|
|
474 | |
|
|
475 | $fork->AnyEvent::Fork::Pool::run ("myworker::function", |
|
|
476 | max => (scalar AnyEvent::Fork::Pool::ncpu 2), |
|
|
477 | ); |
|
|
478 | |
|
|
479 | =cut |
|
|
480 | |
|
|
481 | BEGIN { |
|
|
482 | if ($^O eq "linux") { |
|
|
483 | *ncpu = sub(;$) { |
|
|
484 | my ($cpus, $eus); |
|
|
485 | |
|
|
486 | if (open my $fh, "<", "/proc/cpuinfo") { |
|
|
487 | my %id; |
|
|
488 | |
|
|
489 | while (<$fh>) { |
|
|
490 | if (/^core id\s*:\s*(\d+)/) { |
|
|
491 | ++$eus; |
|
|
492 | undef $id{$1}; |
|
|
493 | } |
|
|
494 | } |
|
|
495 | |
|
|
496 | $cpus = scalar keys %id; |
|
|
497 | } else { |
|
|
498 | $cpus = $eus = @_ ? shift : 1; |
|
|
499 | } |
|
|
500 | wantarray ? ($cpus, $eus) : $cpus |
|
|
501 | }; |
|
|
502 | } elsif ($^O eq "freebsd" || $^O eq "netbsd" || $^O eq "openbsd") { |
|
|
503 | *ncpu = sub(;$) { |
|
|
504 | my $cpus = qx<sysctl -n hw.ncpu> * 1 |
|
|
505 | || (@_ ? shift : 1); |
|
|
506 | wantarray ? ($cpus, $cpus) : $cpus |
|
|
507 | }; |
|
|
508 | } else { |
|
|
509 | *ncpu = sub(;$) { |
|
|
510 | my $cpus = @_ ? shift : 1; |
|
|
511 | wantarray ? ($cpus, $cpus) : $cpus |
|
|
512 | }; |
|
|
513 | } |
|
|
514 | } |
|
|
515 | |
451 | =back |
516 | =back |
452 | |
517 | |
453 | =head1 CHILD USAGE |
518 | =head1 CHILD USAGE |
454 | |
519 | |
455 | In addition to the L<AnyEvent::Fork::RPC> API, this module implements one |
520 | In addition to the L<AnyEvent::Fork::RPC> API, this module implements one |