加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 创建一个基于时间的分块枚举

发布时间:2020-12-16 09:09:58 所属栏目:安全 来源:网络整理
导读:我想创建一个Play 2枚举,它接收值并将它们输出,每隔x秒/毫秒就拼凑在一起.这样,在具有大量用户输入的多用户websocket环境中,可以限制每秒接收的帧数. 我知道可以将一组数量的项目组合在一起,如下所示: val chunker = Enumeratee.grouped( Traversable.take[
我想创建一个Play 2枚举,它接收值并将它们输出,每隔x秒/毫秒就拼凑在一起.这样,在具有大量用户输入的多用户websocket环境中,可以限制每秒接收的帧数.

我知道可以将一组数量的项目组合在一起,如下所示:

val chunker = Enumeratee.grouped(
  Traversable.take[Array[Double]](5000) &>> Iteratee.consume()
)

基于时间而不是基于项目的数量,是否有内置的方法?

我正在考虑用定期的Akka工作这样做,但是一见钟情似乎效率不高,我不知道是否会出现简洁问题.

解决方法

这样怎么样?我希望这对你有帮助.

package controllers

 import play.api._
 import play.api.Play.current
 import play.api.mvc._
 import play.api.libs.iteratee._
 import play.api.libs.concurrent.Akka
 import play.api.libs.concurrent.Promise

 object Application extends Controller {

   def index = Action {
     val queue = new scala.collection.mutable.Queue[String]
     Akka.future {
       while( true ){
         Logger.info("hogehogehoge")
         queue += System.currentTimeMillis.toString
         Thread.sleep(100)
       }
     }
     val timeStream = Enumerator.fromCallback { () =>
       Promise.timeout(Some(queue),200)
     }
     Ok.stream(timeStream.through(Enumeratee.map[scala.collection.mutable.Queue[String]]({ queue =>
       var str = ""
       while(queue.nonEmpty){
         str += queue.dequeue + ","
       }
       str
     })))
   }

 }

而且这个文件对你也是有帮助的.
http://www.playframework.com/documentation/2.0/Enumerators

UPDATE
这是播放2.1版本.

package controllers

 import play.api._
 import play.api.Play.current
 import play.api.mvc._
 import play.api.libs.iteratee._
 import play.api.libs.concurrent.Akka
 import play.api.libs.concurrent.Promise
 import scala.concurrent._
 import ExecutionContext.Implicits.global

 object Application extends Controller {

   def index = Action {
     val queue = new scala.collection.mutable.Queue[String]
     Akka.future {
       while( true ){
         Logger.info("hogehogehoge")
         queue += System.currentTimeMillis.toString
         Thread.sleep(100)
       }
     }
     val timeStream = Enumerator.repeatM{
       Promise.timeout(queue,"
       }
       str
     })))
   }

 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读