@Grab(group='org.codehaus.gpars', module='gpars', version='0.11') //not needed in Groovy 1.8.x
import java.util.concurrent.Future
import groovyx.gpars.*
import groovyx.gpars.actor.*
import groovyx.gpars.agent.*
//COLLECTIONS//
List images = ['0001.jpg','2.jpeg','3.png']
GParsPool.withPool {
def selfPortraits = images.findAllParallel{it.contains('j')}.collectParallel{it.toUpperCase()}
assert selfPortraits.join(', ') == '0001.JPG, 2.JPEG'
println selfPortraits.join(', ')
//a map-reduce functional style
def smallestSelfPortrait = images.parallel
.filter{it.contains('j')}
.map{it.toUpperCase()}
.min{it.size()}
assert smallestSelfPortrait == '2.JPEG'
println smallestSelfPortrait
}
println '*' * 20
//FUTURES//
GParsPool.withPool {
Closure longLastingCalculation = { BigInteger a = 1; 2000001.times {i-> a += i }; a }
//create a new closure, which starts the original closure on a thread pool
Closure fastCalculation = longLastingCalculation.async()
//returns almost immediately
Future result = fastCalculation()
//do stuff while long calculation performs …
10.times { print it + '.. '}
println '\nBLOCKED!'
//finally ask for the result, blocking if not yet available
println 'Long result: ' + result.get()
println 'FINALLY DONE!'
}
println '*' * 20
//ACTORS//
class GameMaster extends DefaultActor {
int secretNum
int upto = 20
void afterStart() {
secretNum = new Random().nextInt(upto)
}
void act() {
loop {
react { int num ->
if (num > secretNum)
reply 'too large'
else if (num < secretNum)
reply 'too small'
else {
reply 'you win'
terminate()
}
}
}
}
}
class Player extends DefaultActor {
String name
Actor server
int myNum
int upto = 20
int guessCounter = 0
void act() {
loop {
myNum = new Random().nextInt(upto)
server.send myNum
react { String msg ->
guessCounter++
switch (msg) {
case 'too large':
println "$name: (guess #${guessCounter}) $myNum was too large"
break
case 'too small':
println "$name: (guess #${guessCounter}) $myNum was too small"
break
case 'you win':
println "$name: (guess #${guessCounter}) I won: $myNum"
terminate()
}
}
}
}
}
def master = new GameMaster().start()
def player = new Player(name: 'Player', server: master).start()
[master, player]*.join()
println 'GAME OVER!'
println '*' * 20
//AGENTS//
/**
* Conference stores number of registrations and allows parties to register and unregister.
* It inherits from the Agent class and adds the register() and unregister() private methods,
* which callers may use it the commands they submit to the Conference.
*/
class Conference extends Agent {
def Conference() { super(0) }
private def registered() { return data }
private def register(long num) { data += num }
private def unregister(long num) { data -= num }
}
final Agent conference = new Conference() //new Conference created
/**
* Three external parties will try to register/unregister concurrently
*/
final Thread t1 = Thread.start {
conference << {register(10L)} //send a command to register 10 attendees
}
final Thread t4 = Thread.start {
conference << {register(5L); println "!"+registered()} //send a command to view registered number
}
final Thread t2 = Thread.start {
conference << {register(5L)} //send a command to register 5 attendees
}
final Thread t3 = Thread.start {
conference << {unregister(13L)} //send a command to unregister 3 attendees
}
[t1, t2, t3, t4]*.join()
assert 7L == conference.val
println conference.val
println '*' * 20
http://groovyconsole.appspot.com/script/452001
Tuesday, March 29, 2011
GPars Concurrent/Parallel
Labels:
concurrent,
gpars,
parallel
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment