Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 异步启动的成本_Multithreading_F#_Async Await_Mailboxprocessor - Fatal编程技术网

Multithreading 异步启动的成本

Multithreading 异步启动的成本,multithreading,f#,async-await,mailboxprocessor,Multithreading,F#,Async Await,Mailboxprocessor,在mailboxprocessor循环中,我从阻塞集合中读取以前存储在此类集合中的项。因为我使用相同的循环来写入这样的集合,所以我需要将其作为线程启动 async { process(queue.Take()) } |> Aysync.Start 我的整个代码的执行速度很慢(相对而言),我怀疑原因是我启动的新线程,尽管我启动了线程池 let toto = ThreadPool.SetMinThreads(300,300) 另一个关于争用点可能在这里的提示是,如果我只在队列为空时启动(并

在mailboxprocessor循环中,我从阻塞集合中读取以前存储在此类集合中的项。因为我使用相同的循环来写入这样的集合,所以我需要将其作为线程启动

async { process(queue.Take()) } |> Aysync.Start
我的整个代码的执行速度很慢(相对而言),我怀疑原因是我启动的新线程,尽管我启动了线程池

let toto = ThreadPool.SetMinThreads(300,300)
另一个关于争用点可能在这里的提示是,如果我只在队列为空时启动(并锁定整个部分),我的运行时间会有很大的变化,从350毫秒到7秒,如果不是,则保持在5-10秒左右

我的问题是:

  • 我是否可以在这里加速线程的创建
  • 是否有一些结构已经处理了这种情况(消费者/生产者?),可以在mailboxprocessor中使用

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

因此,我认为在程序中首先要寻找的是线程被阻塞的地方,并用异步等待代替


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

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

async { process(queue.Take()) } |> Aysync.Start
因此,我认为在程序中首先要寻找的是线程被阻塞的地方,并用异步等待代替


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

不要猜测性能问题在哪里,请测量它!你可以用剖析器来做这件事。很好。我也是一个坚定的信徒,先测量后优化,我想我应该应用它。你能把它转换成一个答案吗?(因为我发现了dotnet+fsharp之类的东西,所以我对做分析的好工具知之甚少……任何推荐都值得赞赏)@nicolas-为什么会有这么多线程。我怀疑在我的情况下,在大约20个线程(如果CPU受限,甚至更少)的情况下,您会发现速度更快。我在昨天之前不知道SetMinThreads(如果我排除5年前所知道的一切:),并且遇到了一个案例,它是缓慢的根源,所以谁知道呢..我认为svick有一个优点:在优化之前,应该进行测量。这可能只是我所称的IO系统中的一些有效的缓慢。我的计算从400毫秒到20秒。所以我的问题首先是不适定的。不要猜测你的性能问题在哪里,测量它!你可以用剖析器来做这件事。很好。我也是一个坚定的信徒,先测量后优化,我想我应该应用它。你能把它转换成一个答案吗?(因为我发现了dotnet+fsharp之类的东西,所以我对做分析的好工具知之甚少……任何推荐都值得赞赏)@nicolas-为什么会有这么多线程。我怀疑在我的情况下,在大约20个线程(如果CPU受限,甚至更少)的情况下,您会发现速度更快。我在昨天之前不知道SetMinThreads(如果我排除5年前所知道的一切:),并且遇到了一个案例,它是缓慢的根源,所以谁知道呢..我认为svick有一个优点:在优化之前,应该进行测量。这可能只是我所称的IO系统中的一些有效的缓慢。我的计算从400毫秒到20秒。所以我的问题首先是不适定的。我似乎重新实现了BlockingQueueAgent。这并不是那么简单。至少我学到了很多。事实上,减少线程数量并没有什么影响。在我设置它的时候,我确实看到了一个太小的池()的效果,所以将它设置为一些高的数字。在这里,减少它的影响很小,所以“pb”在别处。除了您关于BlockingQueueAgent的有用提示之外,您建议先使用哪种工具进行测量,然后再进行优化?tomas,我希望您为我使用线程和关于它们的旧知识重新实现mailboxagent而感到抱歉,并完全忽略了您精心设计的mailboxagent。我似乎已经重新实现了BlockingQueueAgent。这并不是那么简单。至少我学到了很多。事实上,减少线程数量并没有什么影响。在我设置它的时候,我确实看到了一个太小的池()的效果,所以将它设置为一些高的数字。在这里,减少它的影响很小,所以“pb”在别处。除了你关于BlockingQueueAgent的有用提示之外,你会推荐哪种工具先进行测量,然后再进行优化?tomas,我希望你为我使用线程和关于线程的旧知识重新实现mailboxagent而感到抱歉,我完全忽略了你精心设计的mailboxagent。
async { process(queue.Take()) } |> Aysync.Start