[英]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.