ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/Coro/Coro.pm
(Generate patch)

Comparing cvsroot/Coro/Coro.pm (file contents):
Revision 1.248 by root, Mon Dec 15 15:03:31 2008 UTC vs.
Revision 1.264 by root, Thu Aug 13 02:35:41 2009 UTC

40points in your program, so locking and parallel access are rarely an 40points in your program, so locking and parallel access are rarely an
41issue, making thread programming much safer and easier than using other 41issue, making thread programming much safer and easier than using other
42thread models. 42thread models.
43 43
44Unlike the so-called "Perl threads" (which are not actually real threads 44Unlike the so-called "Perl threads" (which are not actually real threads
45but only the windows process emulation ported to unix), Coro provides a 45but only the windows process emulation ported to unix, and as such act
46full shared address space, which makes communication between threads 46as processes), Coro provides a full shared address space, which makes
47very easy. And threads are fast, too: disabling the Windows process 47communication between threads very easy. And Coro's threads are fast,
48emulation code in your perl and using Coro can easily result in a two to 48too: disabling the Windows process emulation code in your perl and using
49four times speed increase for your programs. 49Coro can easily result in a two to four times speed increase for your
50programs. A parallel matrix multiplication benchmark runs over 300 times
51faster on a single core than perl's pseudo-threads on a quad core using
52all four cores.
50 53
51Coro achieves that by supporting multiple running interpreters that share 54Coro achieves that by supporting multiple running interpreters that share
52data, which is especially useful to code pseudo-parallel processes and 55data, which is especially useful to code pseudo-parallel processes and
53for event-based programming, such as multiple HTTP-GET requests running 56for event-based programming, such as multiple HTTP-GET requests running
54concurrently. See L<Coro::AnyEvent> to learn more on how to integrate Coro 57concurrently. See L<Coro::AnyEvent> to learn more on how to integrate Coro
55into an event-based environment. 58into an event-based environment.
56 59
57In this module, a thread is defined as "callchain + lexical variables + 60In this module, a thread is defined as "callchain + lexical variables +
58@_ + $_ + $@ + $/ + C stack), that is, a thread has its own callchain, 61some package variables + C stack), that is, a thread has its own callchain,
59its own set of lexicals and its own set of perls most important global 62its own set of lexicals and its own set of perls most important global
60variables (see L<Coro::State> for more configuration and background info). 63variables (see L<Coro::State> for more configuration and background info).
61 64
62See also the C<SEE ALSO> section at the end of this document - the Coro 65See also the C<SEE ALSO> section at the end of this document - the Coro
63module family is quite large. 66module family is quite large.
77 80
78our $idle; # idle handler 81our $idle; # idle handler
79our $main; # main coro 82our $main; # main coro
80our $current; # current coro 83our $current; # current coro
81 84
82our $VERSION = 5.13; 85our $VERSION = 5.162;
83 86
84our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub); 87our @EXPORT = qw(async async_pool cede schedule terminate current unblock_sub);
85our %EXPORT_TAGS = ( 88our %EXPORT_TAGS = (
86 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)], 89 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)],
87); 90);
203Example: Create a new coro that just prints its arguments. 206Example: Create a new coro that just prints its arguments.
204 207
205 async { 208 async {
206 print "@_\n"; 209 print "@_\n";
207 } 1,2,3,4; 210 } 1,2,3,4;
208
209=cut
210
211sub async(&@) {
212 my $coro = new Coro @_;
213 $coro->ready;
214 $coro
215}
216 211
217=item async_pool { ... } [@args...] 212=item async_pool { ... } [@args...]
218 213
219Similar to C<async>, but uses a coro pool, so you should not call 214Similar to C<async>, but uses a coro pool, so you should not call
220terminate or join on it (although you are allowed to), and you get a 215terminate or join on it (although you are allowed to), and you get a
335 330
336These functions implement the same concept as C<dynamic-wind> in scheme 331These functions implement the same concept as C<dynamic-wind> in scheme
337does, and are useful when you want to localise some resource to a specific 332does, and are useful when you want to localise some resource to a specific
338coro. 333coro.
339 334
340They slow down coro switching considerably for coros that use 335They slow down thread switching considerably for coros that use them
341them (But coro switching is still reasonably fast if the handlers are 336(about 40% for a BLOCK with a single assignment, so thread switching is
342fast). 337still reasonably fast if the handlers are fast).
343 338
344These functions are best understood by an example: The following function 339These functions are best understood by an example: The following function
345will change the current timezone to "Antarctica/South_Pole", which 340will change the current timezone to "Antarctica/South_Pole", which
346requires a call to C<tzset>, but by using C<on_enter> and C<on_leave>, 341requires a call to C<tzset>, but by using C<on_enter> and C<on_leave>,
347which remember/change the current timezone and restore the previous 342which remember/change the current timezone and restore the previous
348value, respectively, the timezone is only changes for the coro that 343value, respectively, the timezone is only changed for the coro that
349installed those handlers. 344installed those handlers.
350 345
351 use POSIX qw(tzset); 346 use POSIX qw(tzset);
352 347
353 async { 348 async {
370 }; 365 };
371 366
372This can be used to localise about any resource (locale, uid, current 367This can be used to localise about any resource (locale, uid, current
373working directory etc.) to a block, despite the existance of other 368working directory etc.) to a block, despite the existance of other
374coros. 369coros.
370
371Another interesting example implements time-sliced multitasking using
372interval timers (this could obviously be optimised, but does the job):
373
374 # "timeslice" the given block
375 sub timeslice(&) {
376 use Time::HiRes ();
377
378 Coro::on_enter {
379 # on entering the thread, we set an VTALRM handler to cede
380 $SIG{VTALRM} = sub { cede };
381 # and then start the interval timer
382 Time::HiRes::setitimer &Time::HiRes::ITIMER_VIRTUAL, 0.01, 0.01;
383 };
384 Coro::on_leave {
385 # on leaving the thread, we stop the interval timer again
386 Time::HiRes::setitimer &Time::HiRes::ITIMER_VIRTUAL, 0, 0;
387 };
388
389 &{+shift};
390 }
391
392 # use like this:
393 timeslice {
394 # The following is an endless loop that would normally
395 # monopolise the process. Since it runs in a timesliced
396 # environment, it will regularly cede to other threads.
397 while () { }
398 };
399
375 400
376=item killall 401=item killall
377 402
378Kills/terminates/cancels all coros except the currently running one. 403Kills/terminates/cancels all coros except the currently running one.
379 404
423the ready queue, do nothing and return false. 448the ready queue, do nothing and return false.
424 449
425This ensures that the scheduler will resume this coro automatically 450This ensures that the scheduler will resume this coro automatically
426once all the coro of higher priority and all coro of the same 451once all the coro of higher priority and all coro of the same
427priority that were put into the ready queue earlier have been resumed. 452priority that were put into the ready queue earlier have been resumed.
453
454=item $coro->suspend
455
456Suspends the specified coro. A suspended coro works just like any other
457coro, except that the scheduler will not select a suspended coro for
458execution.
459
460Suspending a coro can be useful when you want to keep the coro from
461running, but you don't want to destroy it, or when you want to temporarily
462freeze a coro (e.g. for debugging) to resume it later.
463
464A scenario for the former would be to suspend all (other) coros after a
465fork and keep them alive, so their destructors aren't called, but new
466coros can be created.
467
468=item $coro->resume
469
470If the specified coro was suspended, it will be resumed. Note that when
471the coro was in the ready queue when it was suspended, it might have been
472unreadied by the scheduler, so an activation might have been lost.
473
474To avoid this, it is best to put a suspended coro into the ready queue
475unconditionally, as every synchronisation mechanism must protect itself
476against spurious wakeups, and the one in the Coro family certainly do
477that.
428 478
429=item $is_ready = $coro->is_ready 479=item $is_ready = $coro->is_ready
430 480
431Returns true iff the Coro object is in the ready queue. Unless the Coro 481Returns true iff the Coro object is in the ready queue. Unless the Coro
432object gets destroyed, it will eventually be scheduled by the scheduler. 482object gets destroyed, it will eventually be scheduled by the scheduler.
693Wait for the specified rouse callback (or the last one that was created in 743Wait for the specified rouse callback (or the last one that was created in
694this coro). 744this coro).
695 745
696As soon as the callback is invoked (or when the callback was invoked 746As soon as the callback is invoked (or when the callback was invoked
697before C<rouse_wait>), it will return the arguments originally passed to 747before C<rouse_wait>), it will return the arguments originally passed to
698the rouse callback. 748the rouse callback. In scalar context, that means you get the I<last>
749argument, just as if C<rouse_wait> had a C<return ($a1, $a2, $a3...)>
750statement at the end.
699 751
700See the section B<HOW TO WAIT FOR A CALLBACK> for an actual usage example. 752See the section B<HOW TO WAIT FOR A CALLBACK> for an actual usage example.
701 753
702=back 754=back
703 755

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines