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

Comparing Coro/Coro.pm (file contents):
Revision 1.265 by root, Sat Aug 22 22:36:23 2009 UTC vs.
Revision 1.266 by root, Wed Aug 26 07:41:07 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, and as such act 45but only the windows process emulation (see section of same name for more
46as processes), Coro provides a full shared address space, which makes 46details) ported to unix, and as such act as processes), Coro provides
47communication between threads very easy. And Coro's threads are fast, 47a full shared address space, which makes communication between threads
48too: disabling the Windows process emulation code in your perl and using 48very easy. And Coro's threads are fast, too: disabling the Windows
49Coro can easily result in a two to four times speed increase for your 49process emulation code in your perl and using Coro can easily result in
50programs. A parallel matrix multiplication benchmark runs over 300 times 50a two to four times speed increase for your programs. A parallel matrix
51faster on a single core than perl's pseudo-threads on a quad core using 51multiplication benchmark runs over 300 times faster on a single core than
52all four cores. 52perl's pseudo-threads on a quad core using all four cores.
53 53
54Coro achieves that by supporting multiple running interpreters that share 54Coro achieves that by supporting multiple running interpreters that share
55data, which is especially useful to code pseudo-parallel processes and 55data, which is especially useful to code pseudo-parallel processes and
56for event-based programming, such as multiple HTTP-GET requests running 56for event-based programming, such as multiple HTTP-GET requests running
57concurrently. 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
854works. 854works.
855 855
856=back 856=back
857 857
858 858
859=head1 WINDOWS PROCESS EMULATION
860
861A great many people seem to be confused about ithreads (for example, Chip
862Salzenberg called me unintelligent, incapable, stupid and ingullible,
863while in the same mail making rather confused statements about perl
864ithreads (for example, that memory or files would be shared), showing his
865lack of understanding of this area - if it is hard to understand for Chip,
866it is probably not obvious to everybody).
867
868What follows is an ultra-condensed version of my talk about threads in
869scripting languages given onthe perl workshop 2009:
870
871The so-called "ithreads" were originally implemented for two reasons:
872first, to (badly) emulate unix processes on native win32 perls, and
873secondly, to replace the older, real thread model ("5.005-threads").
874
875It does that by using threads instead of OS processes. The difference
876between processes and threads is that threads share memory (and other
877state, such as files) between threads within a single process, while
878processes do not share anything (at least not semantically). That
879means that modifications done by one thread are seen by others, while
880modifications by one process are not seen by other processes.
881
882The "ithreads" work exactly like that: when creating a new ithreads
883process, all state is copied (memory is copied physically, files and code
884is copied logically). Afterwards, it isolates all modifications. On UNIX,
885the same behaviour can be achieved by using operating system processes,
886except that UNIX typically uses hardware built into the system to do this
887efficiently, while the windows process emulation emulates this hardware in
888software (rather efficiently, but of course it is still much slower than
889dedicated hardware).
890
891As mentioned before, loading code, modifying code, modifying data
892structures and so on is only visible in the ithreads process doing the
893modification, not in other ithread processes within the same OS process.
894
895This is why "ithreads" do not implement threads for perl at all, only
896processes. What makes it so bad is that on non-windows platforms, you can
897actually take advantage of custom hardware for this purpose (as evidenced
898by the forks module, which gives you the (i-) threads API, just much
899faster).
900
901Sharing data is in the i-threads model is done by transfering data
902structures between threads using copying semantics, which is very slow -
903shared data simply does not exist. Benchmarks using i-threads which are
904communication-intensive show extremely bad behaviour with i-threads (in
905fact, so bad that Coro, which cannot take direct advantage of multiple
906CPUs, is often orders of magnitude faster because it shares data using
907real threads, refer to my talk for details).
908
909As summary, i-threads *use* threads to implement processes, while
910the compatible forks module *uses* processes to emulate, uhm,
911processes. I-threads slow down every perl program when enabled, and
912outside of windows, serve no (or little) practical purpose, but
913disadvantages every single-threaded Perl program.
914
915This is the reason that I try to avoid the name "ithreads", as it is
916misleading as it implies that it implements some kind of thread model for
917perl, and prefer the name "windows process emulation", which describes the
918actual use and behaviour of it much better.
919
859=head1 SEE ALSO 920=head1 SEE ALSO
860 921
861Event-Loop integration: L<Coro::AnyEvent>, L<Coro::EV>, L<Coro::Event>. 922Event-Loop integration: L<Coro::AnyEvent>, L<Coro::EV>, L<Coro::Event>.
862 923
863Debugging: L<Coro::Debug>. 924Debugging: L<Coro::Debug>.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines