Multi-Core and Concurrency - Languages, Libraries and Development Techniques
I've used processing for Python. It mimicks the API of the threading module and is thus quite easy to use.
If you happen to use map/imap
or a generator/list comprehension, converting your code to use processing
is straightforward:
def do_something(x):
return x**(x*x)
results = [do_something(n) for n in range(10000)]
can be parallelized with
import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))
which will use however many processors you have to calculate the results. There are also lazy (Pool.imap
) and asynchronous variants (Pool.map_async
).
There is a queue class which implements Queue.Queue
, and workers that are similar to threads.
Gotchas
processing
is based on fork()
, which has to be emulated on Windows. Objects are transferred via pickle
/unpickle
, so you have to make sure that this works. Forking a process that has acquired resources already might not be what you want (think database connections), but in general it works. It works so well that it has been added to Python 2.6 on the fast track (cf. PEP-317).
I'd suggest two paradigm shifts:
Software Transactional Memory
You may want to take a look at the concept of Software Transactional Memory (STM). The idea is to use optimistic concurrency: any operation that runs in parallel to others try to complete its job in an isolated transaction; if at some point another transaction has been committed that invalidates data on which this transaction is working, the transaction's work is throwed away and the transaction run again.
I think the first widely known implementation of the idea (if not the proof-of-concept and first one) is the one in Haskell : Papers and presentations about transactional memory in Haskell. Many other implementations are listed on Wikipedia's STM article.
Event loops and promises
Another very different way of dealing with concurrency is implemented in the [E programming language](http://en.wikipedia.org/wiki/E_(programming_language%29).
Note that its way of dealing with concurrency, as well as other parts of the language design, is heavily based on the Actor model.
You mentioned Java, but you only mention threads. Have you looked at Java's concurrent library? It comes bundled with Java 5 and above.
It's a very nice library containing ThreadPools, CopyOnWriteCollections to name a very few. Check out the documentation at the Java Tutorial. Or if you prefer, the Java docs.
Some Scala based stuff:
- PiLib: A Hosted Language for Pi-Calculus Style Concurrency
- Event-Based Programming without Inversion of Control
- Actors that Unify Threads and Events
- Scala Multicast Actors: Architecture and Implementation
- Implementing Joins using Extensible Pattern Matching
- Communicating Scala Objects (Revised)