1

在邮箱处理器循环中,我从先前存储在此类集合中的阻塞集合中读取项目。由于我使用相同的循环来写入此类集合,因此我需要将其作为线程启动。

async { process(queue.Take()) } |> Aysync.Start

我的整个代码的执行速度很慢(相对而言),我怀疑原因是我启动的新线程,尽管我启动了线程池

let toto = ThreadPool.SetMinThreads(300,300)

争论点可能在这里的另一个提示是,如果我仅在队列为空时启动(并锁定整个部分)),我的运行时间差异很大,从 350 毫秒到 7 秒,而如果不这样做,它会保持在 5- 10 秒。

我的问题是:

  • 无论如何我可以在这里加速线程的创建
  • 是否有一些结构已经可以在邮箱处理器中使用这种情况(消费者/生产者?)?
4

1 回答 1

1

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

所以,我认为在你的程序中首先要寻找的是线程被阻塞的地方,并将其替换为异步等待。

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

于 2012-04-02T11:00:50.300 回答