Qual è un buon modo per creare metodi non bloccanti in Scala? Un modo in cui posso pensare è creare un thread/attore e il metodo semplicemente invia un messaggio al thread e restituisce. C'è un modo migliore per creare un metodo non bloccante?Come creare metodi non bloccanti in Scala?
risposta
Uso scala.actors.Future:
import actors._
def asyncify[A, B](f: A => B): A => Future[B] = (a => Futures.future(f(a)))
// normally blocks when called
def sleepFor(seconds: Int) = {
Thread.sleep(seconds * 1000)
seconds
}
val asyncSleepFor = asyncify(sleepFor)
val future = asyncSleepFor(5) // now it does NOT block
println("waiting...") // prints "waiting..." rightaway
println("future returns %d".format(future())) // prints "future returns 5" after 5 seconds
sovraccaricato "asyncify" che prende una funzione con più di un parametro viene lasciato come esercizio.
Un avvertimento, tuttavia, è la gestione delle eccezioni. La funzione che è "asincrona" deve gestire tutte le eccezioni stesse catturandole. Il comportamento per le eccezioni espulse dalla funzione non è definito.
Informazioni sui actors.
Dipende dalla definizione di "blocco". A rigor di termini, tutto ciò che richiede l'acquisizione di un blocco sta bloccando. Tutte le operazioni che dipendono dallo stato interno di un attore acquisiscono un blocco sull'attore. Questo include le mandate dei messaggi. Se molti thread tentano di inviare un messaggio a un attore tutto insieme, devono mettersi in fila.
Quindi, se davvero hai bisogno di non bloccare, ci sono varie opzioni in java.util.concurrent.
Detto questo, da un pratico attori prospettiva ti danno qualcosa che abbastanza vicino per non bloccante perché nessuna delle operazioni sincronizzate fare una notevole quantità di lavoro, quindi è probabile che gli attori soddisfare il vostro bisogno.
Ho una spiegazione molto approfondita sul mio blog sui futures. In realtà ti mostra come potresti implementare il futuro da solo, e quindi ti dà un'ottima comprensione dell'argomento. Io suggerisco di leggere che:
Portate il vostro caffè!
- 1. Letture file non bloccanti
- 2. Play Framework: caricamenti di file - bloccanti o non bloccanti?
- 3. Perché dovrei usare socket non bloccanti o bloccanti?
- 4. Come posso ottenere socket non bloccanti connect()?
- 5. Celery + Eventlet + richieste non bloccanti
- 6. Rails: richieste HTTP non bloccanti?
- 7. come creare metodi in beanshell?
- 8. Obsession con script non bloccanti
- 9. In Scala, combina metodi di oggetti come metodi di classe
- 10. Come profilare i metodi in Scala?
- 11. SwapBuffers non bloccanti() con VSync = on
- 12. Come eseguire query MySQL asincrone/non bloccanti in Play framework?
- 13. Informazioni su NodeJS e non bloccanti IO
- 14. Funzioni vs metodi Scala
- 15. Zoccoli non bloccanti: i messaggi sono in coda?
- 16. È possibile eseguire pubub Redis non bloccanti?
- 17. Blocchi di blocco contro blocchi non bloccanti
- 18. Creare metodi concatenati in node.js?
- 19. Lettura due iteratori bloccanti
- 20. Esecuzione di richieste non bloccanti? - Django
- 21. Scrittura di applicazioni PHP non bloccanti
- 22. jQuery chiamate ajax sincroni non bloccanti
- 23. Tipi di metodi Scala e metodi come parametri
- 24. Come creare un oggetto JSON in Scala?
- 25. Come creare un DSL interno in Scala?
- 26. recvfrom() errore 10035 utilizzando socket non bloccanti
- 27. Come creare una mappa ordinata in scala?
- 28. Come ottenere l'elenco metodi a Scala
- 29. Lo scala offre IO asincroni non bloccanti quando si lavora con i file?
- 30. Come scrivere su un file usando IO non bloccanti?