我正在尋找Python的yield from
或gevent的猴子補丁的Java/Akka等價物。放棄線程/ CPU,直到異步調用在Akka和Java中完成爲止?
更新
目前已在關於什麼是問題是問,所以讓我重申這個問題的commets一些困惑:
如果我有前途,我怎麼等待爲了未來在不阻塞線程的情況下進行競爭,並且在未來完成之前不返回給調用者?
比方說我們有方法塊:
public Object foo() {
Object result = someBlockingCall();
return doSomeThingWithResult(result);
}
爲了使這個異步的,我們會通過SomeBlockingCall()回調:
public void foo() {
someAsyncCall(new Handler() {
public void onSuccess(Object result) {
message = doSomethingWithResult(result);
callerRef.tell(message, ActorRef.noSender());
}
});
}
的調用foo()
現在返回在結果準備好之前,調用者不再獲得結果。我們必須通過傳遞消息將結果返回給調用者。要將同步代碼轉換爲異步Akka代碼,需要重新設計調用者。
我想要的是異步代碼,看起來像Python的Gevent等同步代碼。
我想寫:
public Object foo() {
Future future = someAsyncCall();
// save stack frame, go back to the event loop and relinquish CPU
// so other events can use the thread,
// and come back when future is complete and restore stack frame
return yield(future);
}
這將允許我做我同步異步代碼無需重新設計。
這是可行嗎?
注: 的遊戲框架似乎fake this與async()
和AsyncResult
。但是這通常不起作用,因爲我必須編寫處理AsyncResult
的代碼,它看起來像上面的回調處理程序。
是的,只是使用'未來'? ['CompleteableFuture.runAsync'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#runAsync-java.lang.Runnable-)應該這樣做。 –
使用'ExecutorCompletionService'。 –
@Boris the Spider,不,將來會做的事情是讓事件處理程序移到調用者。這個問題沒有解決,因爲調用者在調用處理程序之前仍然存在無關的問題。整個問題是在這段時間內不會阻止。 – Jay