2016-03-06 64 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()