2016-03-06 62 views
1

我想有一個方法調度一個異步任務,並立即返回。我不需要等待結果。 我想是這樣工作的:使用GPars發送一個異步任務,並立即返回

/** 
* 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 
} 

在上述情況下,任務將無法運行,因爲沒有呼籲獲得() ,但是,如果我做獲得() ,該方法將不會返回jobId,直到任務完成。

我該如何派遣任務,並仍然立即返回?

+1

「在上面的情況中,任務獲勝沒有運行,因爲沒有呼叫.get()「:這是不正確的。任務(..)'創建一個任務(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! – 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()