在邮箱处理器循环中,我从以前存储在此类集合中的阻塞集合项读取。因为我使用相同的循环来编写这样的集合,所以我需要以线程的形式启动它。
async { process(queue.Take()) } |> Aysync.Start整个代码的执行是缓慢的(相对地说),我怀疑原因是我启动的新线程,尽管我用
let toto = ThreadPool.SetMinThreads(300,300)争用点可能存在的另一个提示是,如果我只在队列为空(并锁定整个部分)时启动,则运行时变化很大,从350 ms到7s不等,如果不这样,则保持在5-10秒左右。
我的问题是:
,
,
中使用的
发布于 2012-04-02 11:00:50
如果您需要创建数百个线程来运行I/O绑定计算,那么可能出现了一些错误。如果计算是I/O绑定的,那么应该可以使用相对较少的线程来运行它--如果是完全异步的,则意味着线程在任何等待期间都不会被阻塞。
因此,我认为在您的程序中首先要查找的是线程被阻塞的位置,并将其替换为异步等待。
代码示例中的一个可疑之处是队列,它可能在调用Take时阻塞,至少这是BlockingCollection在.NET中的行为方式。您可以尝试用BlockingQueueAgent替换它,它使用F#代理实现了相同的功能,但提供了异步AsyncTake方法,可以在不阻塞线程的情况下调用该方法。
https://stackoverflow.com/questions/9973396
复制相似问题