c# - 关于c#并行化的几个问题

标签 c# parallel-processing

我正在用 C# 编写一个重型网络爬虫。我希望它快速且可靠。 Parallel.Foreach 和 Parallel.For 对此来说太慢了。 对于输入,我使用 URL 列表。我想要最多 300 个线程同时工作(我的 cpu 和网络连接可以处理这个)。最好的方法是什么?使用任务会更有效吗? 有时,线程会无明显原因结束,并且某些结果不会保存。我想要一种更可靠的方法来做到这一点。有任何想法吗? 我想要更可靠的队列类型的抓取。 我想出了什么(不是所有代码,而是重要部分):

        List <string> input = // read text file
        int total = words.Length;
        int maxThreads = 300;

        while (true)
        {
            if (activeThreads < maxThreads)
            {
               current++;
               Thread thread = new Thread(() => CrawlWebsite(words[current]));
               thread.Start();
            }
        }

        public static void CrawlWebsite(string word)
        {
            activeThreads++;

            // scraping part

            activeThreads--;
        }

最佳答案

考虑使用System.Threading.ThreadPool。对于具有许多线程的场景来说,它可能会更快一些,并且您不需要管理 activeThreads。相反,您可以使用 ThreadPool.SetMaxThreads() 和 SetMinThreads(),ThreadPool 会为您管理并行线程的数量。

顺便说一句,您的示例中缺少共享变量的同步。同步访问的方法之一是使用“锁” - 请参阅http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

您的线程运行方法 - CrawlWebsite() 应该处理 ThreadAbortException - 请参阅 http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx .

关于c# - 关于c#并行化的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19335508/

相关文章:

c# - 并行性和 Entity Framework

python - cython.parallel.prange 中的 cython 共享内存 - block

c# - 在客户端 wasm 代码中包含密码是否安全?

c# - 如何在 response.redirect 之前执行启动脚本?

c# - 将 TextBlock 的可见性绑定(bind)到 TextBox

c# - 如何使用匿名 LINQ 结果填充 DataTable

c++ - 这种并发快速排序的实现是否正确?

c# - 动态设置Word CustomTaskPane宽度

CPU周期的计算?

c# - TPL 数据流资源未发布