Iteratee和并发策略

时间:2012-07-03 19:01:07

标签: playframework-2.0

评估不同的服务器解决方案,我需要了解Play2在使用Iteratees时如何处理并发性,特别是在处理Websockets请求时。

如果您查看此代码,显示一个具有共享状态的简单websocket服务器(协作绘制应用程序)https://github.com/gre/playpainter/blob/master/scala/app/controllers/Application.scala

您将看到每个websocket请求都可能修改共享状态,例如画家地图或连接计数器。这段代码线程安全吗?如果是(作者确认),Play2内部如何处理并发?此时,我没有让Scala级别完全理解play2 lib代码。

我想知道他们如何能够以高性能协调线程安全(地图或计数器一次只能由一个线程修改)(多个请求可以“同时”处理。

我能想到的唯一可行的行为是将每个iteratee块的处理包装在自己的线程事务中;最终严重限制了并发性(尽管简化了用户代码)并最终获得了类似于Node.js或任何单线程服务器所能提供的性能?我可以看到Iteratee编程模型对流式传输,文件处理等的好处,但对于每个请求触发非繁琐的工作(服务器计算,数据库访问等)的websockets而言都不是那么多

1 个答案:

答案 0 :(得分:1)

我的应用程序的线程安全性错了,它有一个错误。

我刚刚使用ConcurrentHashMap修复它,请参阅更改https://github.com/gre/playpainter/commit/5120de5b77627836fe26602546f82c99a28cdf1b

感谢您的举报。