C# return 列表中的代理字符串非重复/线程安全
C# return string of proxy from list non-repeat / thread-safe
基本上,我发现我的网络请求只是在我正在进行的网络抓取项目中反复使用相同的代理。
public static List<string> proxyLogs = new List<string>();
private static Random random = new Random();
public static string randomizeProxy(List<string> proxies = null)
{
if (proxies == null)
proxies = proxyLogs;
return proxies[random.Next(proxies.Count)];
}
Parallel.ForEach(concurrentLogs, new ParallelOptions { MaxDegreeOfParallelism = 4}, log =>
{
//my http requests
string proxyLog = randomizeProxy(proxyLogs);
Console.WriteLine(proxyLog);
});
所以并行选项线程设置为 4,它所做的 4 个请求是一遍又一遍地使用相同的代理,并且每个线程都没有不同。
最好的方法是什么?
任何不需要并行的东西,都放在 ForEach 之外。没有理由需要在那里进行随机数选择(特别是因为它不是线程安全的)。
var data = concurrentLogs.Select
(
log => new { Log = log, Proxy = randomizeProxy(proxyLogs) }
).ToList();
Parallel.ForEach( data, new ParallelOptions (MaxDegreeOfParallelism = 4}, item =>
{
var log = item.Log;
var proxyLog = item.Proxy;
Console.WriteLine(proxyLog);
});
基本上,我发现我的网络请求只是在我正在进行的网络抓取项目中反复使用相同的代理。
public static List<string> proxyLogs = new List<string>();
private static Random random = new Random();
public static string randomizeProxy(List<string> proxies = null)
{
if (proxies == null)
proxies = proxyLogs;
return proxies[random.Next(proxies.Count)];
}
Parallel.ForEach(concurrentLogs, new ParallelOptions { MaxDegreeOfParallelism = 4}, log =>
{
//my http requests
string proxyLog = randomizeProxy(proxyLogs);
Console.WriteLine(proxyLog);
});
所以并行选项线程设置为 4,它所做的 4 个请求是一遍又一遍地使用相同的代理,并且每个线程都没有不同。
最好的方法是什么?
任何不需要并行的东西,都放在 ForEach 之外。没有理由需要在那里进行随机数选择(特别是因为它不是线程安全的)。
var data = concurrentLogs.Select
(
log => new { Log = log, Proxy = randomizeProxy(proxyLogs) }
).ToList();
Parallel.ForEach( data, new ParallelOptions (MaxDegreeOfParallelism = 4}, item =>
{
var log = item.Log;
var proxyLog = item.Proxy;
Console.WriteLine(proxyLog);
});