首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Async.Start成本

Async.Start成本
EN

Stack Overflow用户
提问于 2012-04-02 08:52:41
回答 1查看 222关注 0票数 1

在邮箱处理器循环中,我从以前存储在此类集合中的阻塞集合项读取。因为我使用相同的循环来编写这样的集合,所以我需要以线程的形式启动它。

代码语言:javascript
复制
async { process(queue.Take()) } |> Aysync.Start

整个代码的执行是缓慢的(相对地说),我怀疑原因是我启动的新线程,尽管我用

代码语言:javascript
复制
let toto = ThreadPool.SetMinThreads(300,300)

争用点可能存在的另一个提示是,如果我只在队列为空(并锁定整个部分)时启动,则运行时变化很大,从350 ms到7s不等,如果不这样,则保持在5-10秒左右。

我的问题是:

  • ,无论如何,我可以在这里加速线程的创建,

  • ,是否有某种已经解决了这种情况的结构(消费者/生产者?)可以在邮箱处理器?

中使用的

EN

回答 1

Stack Overflow用户

发布于 2012-04-02 11:00:50

如果您需要创建数百个线程来运行I/O绑定计算,那么可能出现了一些错误。如果计算是I/O绑定的,那么应该可以使用相对较少的线程来运行它--如果是完全异步的,则意味着线程在任何等待期间都不会被阻塞。

因此,我认为在您的程序中首先要查找的是线程被阻塞的位置,并将其替换为异步等待。

代码示例中的一个可疑之处是队列,它可能在调用Take时阻塞,至少这是BlockingCollection在.NET中的行为方式。您可以尝试用BlockingQueueAgent替换它,它使用F#代理实现了相同的功能,但提供了异步AsyncTake方法,可以在不阻塞线程的情况下调用该方法。

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

https://stackoverflow.com/questions/9973396

复制
相关文章

相似问题

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