2016-03-06 3 views
1

Я хотел бы иметь метод, который отправляет задачу async и немедленно возвращается. Мне не нужно ждать результата. Я хотел бы что-то вроде этого, чтобы работать:Используйте GPars для отправки задачи async и немедленно возвращайтесь

/** 
* runs a job and return job id for later montoring. 
*/ 
def int runJob(){ 
    int jobId = createJob() // returns immediately 
    task{ 
    doSomthingThatTakesSomeTime() 
    }.then {stepResult-> doSmtgElse(stepResult)} 
    return jobId 
} 

В описанной выше ситуации, задача не будет работать, так как нет ни одного вызова для .get() , однако, если я DO .get() , метод не вернет jobId, пока задача не будет завершена.

Как я могу отправить задание и вернуться немедленно?

+1

«В ситуации выше задача выиграла 't run, так как нет вызова для .get() ": это не так. 'task (..)' создайте задачу (Runnable) и вызовите 'pool.execute' с этой задачей (которая, очевидно, выполнена - модель потоковой передачи зависит от реализации используемого вами пула). –

+0

Спасибо за комментарий, на его основе и ответ @ pczeus, я получил что-то, что сработало хорошо, я добавлю его как ответ –

ответ

1

После прочтения @pczeus ответ и комментарий Жереми B, я пришел с этим:

import static groovyx.gpars.dataflow.Dataflow.task 

def int longTask(){ 
    def counter = 0 
    10.times { 
     println "longTask_${counter}" 
     counter++ 
     sleep 10 
    } 
    counter 
} 

def int getSomeString() { 
    def jobId=55 
    task { 
     longTask() 

    }.then { num -> println "completed running ${num} times" } 
    return jobId 
} 
println getSomeString() 

sleep 2000 

это печатает:

longTask_0 
55 
longTask_1 
longTask_2 
longTask_3 
longTask_4 
longTask_5 
longTask_6 
longTask_7 
longTask_8 
longTask_9 
completed running 10 times 

который является то, что я намеревался: LongTask() работает в фоновом режиме, getSo meString() извлекает, не дожидаясь длинной задачи, и пока программа все еще работает (следовательно, сна 2000), выполняется даже предложение в части «then»

+0

Означает ли это, что вы получили то, что хотели от него? – pczeus

+0

Мне нравится код..очень 'groovy'. Любовь Groovy еще больше! – pczeus

+0

да получил именно то, что я хотел.thx.! –

1

Вы можете запустить этот пример в качестве Groovy сценария:

@Grapes(
     @Grab(group='org.codehaus.gpars', module='gpars', version='1.2.1') 
    ) 

    import java.util.concurrent.* 
    import groovyx.gpars.* 

    def doSomethingThatTakesSomeTime(){ 
     println "calculating..." 
     for(long i: 0..100){ 
      Thread.sleep(i) 
     } 

     println "*done*" 
     "Done with doSomethingThatTakesSomeTime" 
    } 

    def doSomethingElse(){ 
     for(int x:0..1000) print "." 
     println "doSomethingElse done." 
    } 


    /** 
    * runs a job and return job id for later montoring. 
    */ 
    def runJob(){ 
     GParsPool.withPool(){ 
      Future future = createJob() // returns immediately 
      doSomethingElse() //Do someting else while the async process is running 
      //Ok, thats done, but the longer runningprocess is still running, return the future 
      future 
     } 
    } 

    Future createJob(){ 
     //create a new closure, which starts the original closure on a thread pool 
     Closure asyncFunction = { doSomethingThatTakesSomeTime() }.async() 

     //Invoke the function, return a Future 
     asyncFunction() 
    } 

    def job = runJob() 
    //println "\n\nResult is: " + job.get() 

Если вы запустите скрипт «как есть», вы увидите, что он работает и длинный ход работа делает печать *done* указав, что он сделал в факт заканчивается, хотя строка внизу, которая вызывает Future.get(), закомментирована и никогда не вызывалась.

Если вы раскомментировать последнюю строку, вы увидите результат распечатанный После завершения в результате вызова Future.get()