@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 '*' * 20http://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