簡體   English   中英

如何通過GPar中的主actor終止所有從actor?

[英]How to terminate all slave actors via master actor in GPars?

我想讓我的主演員在第一個演員完成工作后就終止所有奴隸演員。
但是,我不知道如何從主設備向所有從設備發送廣播。 是否有為此功能或編程模式?

解決此問題的另一種方法是給主機一個所有從機的列表,並遍歷它們,向每個主機發送一條消息以終止,但是從機也需要將主機作為屬性,我認為這是一個問題:

import groovyx.gpars.actor.Actor
import groovyx.gpars.actor.DefaultActor

class Slave extends DefaultActor {
    Actor master
    int t

    void act() {
        t = new Random().nextInt(1337)
        println "It's me, $t"
        master.send 0
    }

}

class Master extends DefaultActor {
    List slaves 

    void afterStart() {
        println "Master initialized!"
    }

    void killTheSlaves() {
        for (i in 0..slaves.size()-1){
            slaves[i].send -1
        }
    }

    void act() {
        react { int num ->
            if (num == 0)
                killTheSlaves()
        }
    }
}

def sl = new Slave().start()

def ma = new Master(slaves: [sl]).start()
sl.master = ma

此代碼無法編譯。
錯誤信息:

Actor線程Actor線程2中發生異常java.lang.NullPointerException:無法在org.codehaus.groovy上的org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)上的空對象上調用方法send() org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)的.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)org.codehaus.groovy.runtime.callsite.NullCallSite.call (NullCallSite.java:35)在org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)在org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)在Slave.act(ConsoleScript14:11)在groovyx.gpars.actor.DefaultActor.handleStart(DefaultActor.java:342)在groovyx.gpars .actor.AbstractLoopingActor $ 1.handleMessage(AbstractLoopingActor.java:70)在groovyx.gpars.util.AsyncMessagingCore.run(AsyncMessagingCore.java:132) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)在java.lang.Thread.run(Thread.java:745) )

創建從屬服務器后,似乎無法設置sl.master。

有沒有解決方法?

任何幫助是極大的贊賞。
先感謝您!

您應該首先設置參與者,然后啟動它們: def sl = new Slave() def ma = new Master(slaves: [sl]) sl.master = ma sl.start() ma.start()

但是,您的從屬actor通過在主控制器甚至嘗試殺死它們之前用完它們的act()方法來自己完成操作,因此實際上不需要殺死奴隸。

GPars在actor上提供了一個terminate()方法,以優雅地殺死它們,因此您可以考慮將方法更改為: void killTheSlaves() { for (i in 0..slaves.size()-1){ slaves[i].terminate() } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM