我有一个使用多个线程(300)来查询API的程序。目前它表现为爬虫,每个线程根据刚刚处理的API调用结果和随机参数确定其下一个Web API调用。
我已经构建了一个参数列表,它将“随机参数”从等式中取出,并通过消除由于使用该随机参数而发生的冗余API调用,使其更有效。
该列表采用大约800万行的文本文件形式。
理想情况下,我想拥有的是我的主线程中的流读取器对象,该对象是线程安全的,并且只要处理完最后一个线程,所有(300)个其他线程将使用文本文件中的“getLine”一直到文件耗尽。
对于我应该关注的内容,我有点迷茫,任何建议和答案都将不胜感激!
答案 0 :(得分: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);
}