ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro-Multicore/Multicore.pm
Revision: 1.9
Committed: Mon Jul 27 12:05:09 2015 UTC (8 years, 10 months ago) by root
Branch: MAIN
Changes since 1.8: +16 -3 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 NAME
2
3 Coro::Multicore - make coro threads on multiple cores with specially supported modules
4
5 =head1 SYNOPSIS
6
7 # when you DO control the main event loop, e.g. in the main program
8
9 use Coro::Multicore; # enable by default
10
11 Coro::Multicore::scoped_disable;
12 EV::loop; # or AnyEvent::Loop::run, Event::loop, AE::cv->recv, ...
13
14 # when you DO NOT control the event loop, e.g. in a module on CPAN
15
16 use Coro::Multicore (); # disable by default
17
18 async {
19 Coro::Multicore::scoped_enable;
20
21 # blocking is safe in your own threads
22 ...
23 };
24
25 =head1 DESCRIPTION
26
27 EXPERIMENTAL WARNING: This module is in its early stages of
28 development. It's fine to try out, but it didn't receive the normal amount
29 of testing and real-world usage that my other modules have gone through.
30
31 While L<Coro> threads (unlike ithreads) provide real threads similar to
32 pthreads, python threads and so on, they do not run in parallel to each
33 other even on machines with multiple CPUs or multiple CPU cores.
34
35 This module lifts this restriction under two very specific but useful
36 conditions: firstly, the coro thread executes in XS code and does not
37 touch any perl data structures, and secondly, the XS code is specially
38 prepared to allow this.
39
40 This means that, when you call an XS function of a module prepared for it,
41 this XS function can execute in parallel to any other Coro threads.
42
43 The mechanism to support this is easily added to existing modules
44 and is independent of L<Coro> or L<Coro::Multicore>, and therefore
45 could be used, without changes, with other, similar, modules, or even
46 the perl core, should it gain real thread support anytime soon. See
47 L<http://perlmulticore.schmorp.de/> for more info on how to prepare a
48 module to allow parallel execution. Preparing an existing module is easy,
49 doesn't add much overhead and no dependencies.
50
51 This module is an L<AnyEvent> user (and also, if not obvious, uses
52 L<Coro>).
53
54 =head1 HOW TO USE IT
55
56 It could hardly be simpler - if you use coro threads, and before you call
57 a supported lengthy operation implemented in XS, use this module and other
58 coro threads can run in parallel:
59
60 use Coro::Multicore;
61
62 This module has no important API functions to learn or remember. All you
63 need to do is I<load> it before you can take advantage of it.
64
65 =head2 EXPORTS
66
67 This module does not (at the moment) export any symbols. It does, however,
68 export "behaviour" - if you use the default import, then Coro::Multicore
69 will be enabled for all threads and all callers in the whole program:
70
71 use Coro::Multicore;
72
73 In a module where you don't control what else might be loaded and run, you
74 might want to be more conservative, and not import anything. This has the
75 effect of not enabling the functionality by default, so you have to enable
76 it per scope:
77
78 use Coro::Multicore ();
79
80 sub myfunc {
81 Coro::Multicore::scoped_enable;
82
83 # from here to the end of this function, and in any functions
84 # called from this function, tasks will be executed asynchronously.
85 }
86
87 =head1 API FUNCTIONS
88
89 =over 4
90
91 =item $previous = Coro::Multicore::enable [$enable]
92
93 This function enables (if C<$enable> is true) or disables (if C<$enable>
94 is false) the multicore functionality globally. By default, it is enabled.
95
96 This can be used to effectively disable this module's functionality by
97 default, and enable it only for selected threads or scopes, by calling
98 C<Coro::Multicore::scope_enable>.
99
100 The function returns the previous value of the enable flag.
101
102 =item Coro::Multicore::scoped_enable
103
104 This function instructs Coro::Multicore to handle all requests executed
105 in the current coro thread, from the call to the end of the current scope.
106
107 Calls to C<scoped_enable> and C<scoped_disable> don't nest very well at
108 the moment, so don't nest them.
109
110 =item Coro::Multicore::scoped_disable
111
112 The opposite of C<Coro::Multicore::scope_disable>: instructs Coro::Multicore to
113 I<not> handle the next multicore-enabled request.
114
115 =back
116
117 =cut
118
119 package Coro::Multicore;
120
121 use Coro ();
122 use AnyEvent ();
123
124 BEGIN {
125 our $VERSION = 0.02;
126
127 use XSLoader;
128 XSLoader::load __PACKAGE__, $VERSION;
129 }
130
131
132 sub import {
133 if (@_ > 1) {
134 require Carp;
135 Carp::croak ("Coro::Multicore does not export any symbols");
136 }
137
138 enable 1;
139 }
140
141 our $WATCHER = AE::io fd, 0, \&poll;
142
143 =head1 INTERACTION WITH OTHER SOFTWARE
144
145 This module is very similar to other environments where perl interpreters
146 are moved between threads, such as mod_perl2, and the same caveats apply.
147
148 I want to spell out the most important ones:
149
150 =over 4
151
152 =item pthreads usage
153
154 Any creation of pthreads make it impossible to fork portably from a
155 perl program, as forking from within a threaded program will leave the
156 program in a state similar to a signal handler. While it might work on
157 some platforms (as an extension), this might also result in silent data
158 corruption. It also seems to work most of the time, so it's hard to test
159 for this.
160
161 I recommend using something like L<AnyEvent::Fork>, which can create
162 subprocesses safely (via L<Proc::FastSpawn>).
163
164 Similar issues exist for signal handlers, although this module works hard
165 to keep safe perl signals safe.
166
167 =item module support
168
169 This module moves the same perl interpreter between different
170 threads. Some modules might get confused by that (although this can
171 usually be considered a bug). This is a rare case though.
172
173 =item event loop reliance
174
175 To be able to wake up programs waiting for results, this module relies on
176 an active event loop (via L<AnyEvent>). This is used to notify the perl
177 interpreter when the asynchronous task is done.
178
179 Since event loops typically fail to work properly after a fork, this means
180 that some operations that were formerly working will now hang after fork.
181
182 A workaround is to call C<Coro::Multicore::enable 0> after a fork to
183 disable the module.
184
185 Future versions of this module might do this automatically.
186
187 =back
188
189 =head1 BUGS
190
191 =over 4
192
193 =item (OS-) threads are never released
194
195 At the moment, threads that were created once will never be freed. They
196 will be reused for asynchronous requests, though, so as long as you limit
197 the maximum number of concurrent asynchronous tasks, this will also limit
198 the maximum number of threads created.
199
200 The idle threads are not necessarily using a lot of resources: on
201 GNU/Linux + glibc, each thread takes about 8KiB of userspace memory +
202 whatever the kernel needs (probably less than 8KiB).
203
204 Future versions will likely lift this limitation.
205
206 =item AnyEvent is initalised at module load time
207
208 AnyEvent is initialised on module load, as opposed to at a later time.
209
210 Future versions will likely change this.
211
212 =back
213
214 =head1 AUTHOR
215
216 Marc Lehmann <schmorp@schmorp.de>
217 http://software.schmorp.de/pkg/AnyEvent-XSThreadPool.html
218
219 Additional thanks to Zsbán Ambrus, who gave considerable desing input for
220 this module and the perl multicore specification.
221
222 =cut
223
224 1
225