我正在尝试使用Akka为自定义应用程序协议实现TCP服务器.我试图按照这里给出的例子:http://doc.akka.io/docs/akka/2.0/scala/io.html在for ... yield循环中进行非阻塞IO.
我发现当我从yield块中抛出异常时,我无法从块外部捕获它.我想我对Akka或Scala如何在这里工作有一个根本的误解,我会感激任何提示.
我把代码归结为:
import akka.actor._
import java.net.InetSocketAddress
class EchoServer(port: Int) extends Actor {
val state = IO.IterateeRef.Map.async[IO.Handle]()(context.dispatcher)
override def preStart {
IOManager(context.system) listen new InetSocketAddress(port)
}
def receive = {
case IO.NewClient(server) =>
val socket = server.accept()
state(socket) flatMap (_ => EchoServer.processRequest(socket))
case IO.Read(socket, bytes) =>
state(socket)(IO.Chunk(bytes))
case IO.Closed(socket, cause) =>
state(socket)(IO.EOF(None))
state -= socket
}
}
object EchoServer extends App
{
def processRequest(socket: IO.SocketHandle): IO.Iteratee[Unit] =
{
println( "In process request")
try { …Run Code Online (Sandbox Code Playgroud) Tornado是否保证单个RequestHandler同时处理多少请求?我正在考虑像这样管理会话数据:
class MyHandler(tornado.web.RequestHandler):
def prepare(self):
self.session = load_session_from_memcached
def get(self):
# work with self.session
def on_finish(self):
save_session_to_memcached(self.session)
Run Code Online (Sandbox Code Playgroud)
但是,如果self.sessionin get()与the self.sessionin 相同,这只会起作用prepare().如果单个RequestHandler同时处理最多一个请求,那么这只会是真的.这是龙卷风的工作原理吗?