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.256 by root, Wed Jun 17 21:38:23 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.132;
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);
335 338
336These functions implement the same concept as C<dynamic-wind> in scheme 339These 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 340does, and are useful when you want to localise some resource to a specific
338coro. 341coro.
339 342
340They slow down coro switching considerably for coros that use 343They slow down thread switching considerably for coros that use them
341them (But coro switching is still reasonably fast if the handlers are 344(about 40% for a BLOCK with a single assignment, so thread switching is
342fast). 345still reasonably fast if the handlers are fast).
343 346
344These functions are best understood by an example: The following function 347These functions are best understood by an example: The following function
345will change the current timezone to "Antarctica/South_Pole", which 348will 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>, 349requires 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 350which remember/change the current timezone and restore the previous
348value, respectively, the timezone is only changes for the coro that 351value, respectively, the timezone is only changed for the coro that
349installed those handlers. 352installed those handlers.
350 353
351 use POSIX qw(tzset); 354 use POSIX qw(tzset);
352 355
353 async { 356 async {
370 }; 373 };
371 374
372This can be used to localise about any resource (locale, uid, current 375This can be used to localise about any resource (locale, uid, current
373working directory etc.) to a block, despite the existance of other 376working directory etc.) to a block, despite the existance of other
374coros. 377coros.
378
379Another interesting example implements time-sliced multitasking using
380interval timers (this could obviously be optimised, but does the job):
381
382 # "timeslice" the given block
383 sub timeslice(&) {
384 use Time::HiRes ();
385
386 Coro::on_enter {
387 # on entering the thread, we set an VTALRM handler to cede
388 $SIG{VTALRM} = sub { cede };
389 # and then start the interval timer
390 Time::HiRes::setitimer &Time::HiRes::ITIMER_VIRTUAL, 0.01, 0.01;
391 };
392 Coro::on_leave {
393 # on leaving the thread, we stop the interval timer again
394 Time::HiRes::setitimer &Time::HiRes::ITIMER_VIRTUAL, 0, 0;
395 };
396
397 &{+shift};
398 }
399
400 # use like this:
401 timeslice {
402 # The following is an endless loop that would normally
403 # monopolise the process. Since it runs in a timesliced
404 # environment, it will regularly cede to other threads.
405 while () { }
406 };
407
375 408
376=item killall 409=item killall
377 410
378Kills/terminates/cancels all coros except the currently running one. 411Kills/terminates/cancels all coros except the currently running one.
379 412
423the ready queue, do nothing and return false. 456the ready queue, do nothing and return false.
424 457
425This ensures that the scheduler will resume this coro automatically 458This ensures that the scheduler will resume this coro automatically
426once all the coro of higher priority and all coro of the same 459once all the coro of higher priority and all coro of the same
427priority that were put into the ready queue earlier have been resumed. 460priority that were put into the ready queue earlier have been resumed.
461
462=item $coro->suspend
463
464Suspends the specified coro. A suspended coro works just like any other
465coro, except that the scheduler will not select a suspended coro for
466execution.
467
468Suspending a coro can be useful when you want to keep the coro from
469running, but you don't want to destroy it, or when you want to temporarily
470freeze a coro (e.g. for debugging) to resume it later.
471
472A scenario for the former would be to suspend all (other) coros after a
473fork and keep them alive, so their destructors aren't called, but new
474coros can be created.
475
476=item $coro->resume
477
478If the specified coro was suspended, it will be resumed. Note that when
479the coro was in the ready queue when it was suspended, it might have been
480unreadied by the scheduler, so an activation might have been lost.
481
482To avoid this, it is best to put a suspended coro into the ready queue
483unconditionally, as every synchronisation mechanism must protect itself
484against spurious wakeups, and the one in the Coro family certainly do
485that.
428 486
429=item $is_ready = $coro->is_ready 487=item $is_ready = $coro->is_ready
430 488
431Returns true iff the Coro object is in the ready queue. Unless the Coro 489Returns true iff the Coro object is in the ready queue. Unless the Coro
432object gets destroyed, it will eventually be scheduled by the scheduler. 490object gets destroyed, it will eventually be scheduled by the scheduler.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines