Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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
C# 关于c语言并行化的几个问题#_C#_Parallel Processing - Fatal编程技术网

C# 关于c语言并行化的几个问题#

C# 关于c语言并行化的几个问题#,c#,parallel-processing,C#,Parallel Processing,我正在用c#写一个沉重的网页刮板。我希望它快速可靠。 平行。Foreach和Parallel。因为它们的速度太慢了。 对于输入,我使用URL列表。我希望有多达300个线程同时工作(我的cpu和网络连接可以处理这个问题)。最好的方法是什么?使用任务会更好吗? 有时线程会无缘无故地结束,并且某些结果无法保存。我想要一个更可靠的方法。有什么想法吗? 我想有一个更坚实的队列类型的刮。 我想到了什么(不是所有的代码,而是重要的部分): 列表输入=//读取文本文件 int total=单词长度; int最大

我正在用c#写一个沉重的网页刮板。我希望它快速可靠。 平行。Foreach和Parallel。因为它们的速度太慢了。 对于输入,我使用URL列表。我希望有多达300个线程同时工作(我的cpu和网络连接可以处理这个问题)。最好的方法是什么?使用任务会更好吗? 有时线程会无缘无故地结束,并且某些结果无法保存。我想要一个更可靠的方法。有什么想法吗? 我想有一个更坚实的队列类型的刮。 我想到了什么(不是所有的代码,而是重要的部分):

列表输入=//读取文本文件
int total=单词长度;
int最大线程数=300;
while(true)
{
如果(activeThreads爬行网站(单词[当前]);
thread.Start();
}
}
公共静态网站(字符串字)
{
activeThreads++;
//刮削部
活动线程--;
}

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

顺便说一句,您的示例中缺少共享变量的同步。同步访问的方法之一是使用“锁定”-请参阅


另外,您的线程运行方法-CrawlWebsite()应该处理ThreadAbortException-请参阅。

我最近正在处理非常类似的问题,我不认为使用任何大量的线程会使它更快。最慢的思考通常是下载数据。拥有大量的线程并不能使它更快,因为它们大部分都在等待网络连接、数据传输等。因此,我最终拥有了两个队列。一个是由少数线程处理,这些线程只发送异步下载请求(一次10-15个请求)。响应存储在另一个队列中,该队列进入另一个负责解析和数据处理的线程池(此处的线程数取决于CPU和处理算法)


我还将所有下载的数据保存到数据库中。每当我想从web上解析一些新信息时,我不需要重新下载内容,只需要从DB解析缓存的web(这节省了大量时间)

activeThreads不受保护,将有比赛条件。你是如何确定这两种
并行
方法太慢的?@John Saunders我尝试了我自己的示例和并行。Foreach并比较了结果。并行。即使将MaxDegreeOfParallelism设置为更高的数值,Foreach也只运行2个线程。我不确定锁定是否正确应该是原子的,也应该是比较的。您还可以创建联锁类。如果有一些竞速情况,您将以301或299个线程结束-不要认为这是一个问题,因为您有有限的队列。错误可能出现在
中,而(true)
循环始终使用CPU作为100%。它要么创建新线程,要么跳转到开头。试着插入线程。屈服或者在那里休息一下。++和-,根本不是原子的。原子操作是
互锁的。增量(
互锁的。减量(
)。此外,对于OP来说,您使用的是什么版本的.NET?请您介绍一下您是如何下载刮取数据的,有一些甚至比从internet下载的线程更好。
        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--;
        }