2016-10-10 39 views
-1

我已经创建了从网页中抓取内容的应用程序。刮擦方法正在另一个线程上运行。比方说,它可以在100秒内从1000个网页中删除内容。为每个循环分配X个线程为1

我没做什么测试。我运行我的应用程序5次,并将不同的1000个网址放到每个应用程序中。现在,它在150秒内从5000个URL中删除内容。

好吧,但我不想每次运行5个应用程序。我想更快地制作foreach循环(用于从links对象获得link)。

我无法真正使用每个链接的新线程,因为它给我out of memory exception。我认为Parallel循环会做同样的事情。

我喜欢让我的foreach循环运行更快,大约5到10次。我的代码是这样的:

foreach (Link link in links) 
    scrapeContent(link.url); 

我该如何运行它更快?分配线程将是最好的选择?

+4

“我认为并行循环会做同样的事情。” ---如何检查而不是“思考”?事实总是比假设更好。 – zerkms

+0

总体速度可能是由某些Web服务器响应缓慢所限制的。如果您并行运行多个请求,则可以利用等待时间,从而提高吞吐量。我的方法将是一堆线程。通过反复试验优化池大小。 –

+0

如果你能显示你所有的代码,那真的很棒。只是你显示的一小部分没有帮助。理想情况下,我们希望能够运行您的代码,然后将其与我们所做的任何改进进行比较,以便我们确信我们已经改进并因此回答了您的问题。 – Enigmativity

回答

0

不能始终开始一个新的线程,因为创建一个线程会花费一些时间和资源(内存)。

因此,您可以改用线程池。创建一个线程池来重用让一个线程芯片的那些threads.Instead,你送它回到它可以随时收到请求时被重用池中

使用你的线程是这样的:

ThreadPool.QueueUserWorkItem((s) =>{ 

//Your method here. 
Console.WriteLine(“Working on a thread from threadpool”); 

}); 
+1

为什么不是'Parallel.ForEach'? – VMAtm

+0

OfCourse你可以使用任何使用线程池来重用线程的任何东西,甚至任务(System.threading.task)。 – Rajput

+0

@VMWith Parallel.Foreach我得到'System.StackOverflowException' – Dawvawd