1

我有一个使用多个线程(300)来查询 API 的程序。目前它表现为一个爬虫,每个线程根据它刚刚处理的 API 调用的结果和一个随机参数来确定它的下一个 Web API 调用。

我已经建立了一个参数列表,它将把“随机参数”排除在外,并通过消除由于使用该随机参数而发生的冗余 API 调用来提高效率。

该列表采用大约 800 万行的文本文件形式。

理想情况下,我希望在我的主线程中拥有一个流读取器对象,该对象将是线程安全的,并且所有(300)个其他线程将在处理完最后一个线程时使用从文本文件“getLine”直到用尽的文件。

我对我应该看什么有点迷茫,任何建议和答案将不胜感激!

4

1 回答 1

0

第一种方式

    public static string GetLineThreadSafe(this StreamReader sr)
    {
        lock (sr)
        {
            return sr.EndOfStream ? null : sr.ReadLine();
        }
    }

第二种方式

    public static IEnumerable<string> GetEnumirator(this StreamReader sr)
    {
        while (!sr.EndOfStream)
        {
            yield return sr.ReadLine();
        }
    }

    public static void ProcessParalel(this StreamReader sr, Action<string> action, int threadsCount)
    {
        ParallelOptions po = new ParallelOptions();
        po.MaxDegreeOfParallelism = threadsCount;
        Parallel.ForEach(sr.GetEnumirator(), po, action);
    }
于 2013-07-14T06:26:40.087 回答