首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MailboxProcessor使用指南?

MailboxProcessor使用指南?
EN

Stack Overflow用户
提问于 2010-08-10 04:24:40
回答 4查看 4K关注 0票数 18

我刚刚发现了F#中的MailboxProcessor,它被用作“状态机”……但我找不到太多关于它们的推荐用法。

例如..。假设我正在制作一个有100个屏幕上的敌人的简单游戏,我是否应该使用MailboxProcessor来改变敌人的位置和生命;给我200个活动的MailboxProcessor?

在幕后有没有什么聪明的线程管理?我应该尝试限制我拥有的活动MailboxProcessor的数量,或者我可以继续随意地将它们清除掉吗?

提前谢谢你,

JD.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-10 05:02:27

如所述

http://blogs.msdn.com/b/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx

你可以随意地把他们踢出去。试试看!他们使用ThreadPool。我还没有尝试过这个实时GUI游戏应用,但如果这足够好,我也不会感到惊讶。

票数 9
EN

Stack Overflow用户

发布于 2010-08-10 05:02:25

敌人模拟的MailboxProcessor可能如下所示:

代码语言:javascript
复制
MailboxProcessor.Start(fun inbox ->
async {
  while true do
    let! message = inbox.Receive()
    processMessage(message)
})

它在等待消息到达时不消耗线程(let! message =行)。然而,一旦消息到达,它将消耗一个线程(在线程池中)。如果有100个邮箱处理器同时接收一条消息,它们都会尝试唤醒并消耗一个线程。由于这里的消息处理是受CPU限制的,100个邮箱处理器将全部唤醒并开始生成(线程池)线程。这不是一个很好的表现。

邮箱处理器擅长的一种情况是,有许多并发客户端都向一个处理器发送消息(想象一下,几个并行的web爬虫都下载页面并将结果下沉到一个队列中)。屏幕上的敌人情况看起来不同-它是许多实体对单一消息来源(玩家移动/时间滴答)做出响应。

另一个例子是I/O绑定MailboxProcessor,成千上万的MailboxProcessors是一个很好的解决方案:

代码语言:javascript
复制
MailboxProcessor.Start(fun inbox ->
async {
  while true do
    let! message = inbox.Receive()
    match message with
    |  ->
         do! AsyncWrite("something")
         let! response = AsyncResponse()
         ...
})

在这里,在接收到消息后,代理非常快速地生成一个线程,但仍然需要跨异步操作维护状态。这在实践中会有很好的伸缩性--你可以运行成千上万个这样的代理:这是一个编写web服务器的好方法。

票数 14
EN

Stack Overflow用户

发布于 2013-07-01 17:42:36

说我正在制作一个有100个屏幕上的敌人的简单游戏,我应该使用MailboxProcessor来改变敌人的位置和生命;给我200个活动的MailboxProcessor吗?

我看不出有任何理由尝试使用MailboxProcessor来实现这一点。串行循环可能更简单、更快。

有没有什么聪明的线程管理在幕后进行?

是的,很多。但是它是为异步并发编程(特别是可伸缩IO)而设计的,而您的程序并没有真正做到这一点吗?

我应该尝试限制我拥有的活动MailboxProcessor的数量,或者我可以继续随意地将它们排除在外吗?

你可以随意地淘汰它们,但它们还远远没有优化,而且性能比串行代码差得多。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3443875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档