gpt4 book ai didi

c# - 连续执行的多线程 WebRequests

转载 作者:行者123 更新时间:2023-11-30 18:22:05 27 4
gpt4 key购买 nike

我正在用 C# 构建一个网络抓取工具,用于处理代理和大量请求。页面通过 ConnectionManager 类加载,该类获取代理并使用随机代理重试加载该页面,直到页面被正确加载。

平均一个任务需要100到300个请求,为了加快这个过程,我设计了使用多线程同时下载网页的方法。

        public Review[] getReviewsMultithreaded(int reviewCount)
{
ArrayList reviewList = new ArrayList();
int currentIndex = 0;
int currentPage = 1;
int totalPages = (reviewCount / 10) + 1;
bool threadHasMoreWork = true;
Object pageLock = new Object();
Thread[] threads = new Thread[Program.maxScraperThreads];

for(int i = 0; i < Program.maxScraperThreads; i++)
{
threads[i] = (new Thread(() =>
{
while (threadHasMoreWork)
{
HtmlDocument doc;
lock(pageLock)
{
if (currentPage <= totalPages)
{
string builtString = "http://www.example.com/reviews/" + _ID + "?pageNumber=" + currentPage;
//Log.WriteLine(builtString);
currentPage++;
doc = Program.conManager.loadDocument(builtString);
}
else
{
threadHasMoreWork = false;
continue;
}
}

try
{
//Get info from page and add to list
reviewList.Add(cRev);
}
Log.WriteLine(_asin + " reviews scraped: " + reviewList.Count);
}
catch (Exception ex) { continue; }
}
}));
threads[i].Start();
}

bool threadsAreRunning = true;
while(threadsAreRunning) //this is in a separate thread itself, so as not to interrupt the GUI
{
threadsAreRunning = false;
foreach (Thread t in threads)
if (t.IsAlive)
{
threadsAreRunning = true;
Thread.Sleep(2000);
}
}

//flatten the arraylist to a primitive
return reviewArray;
}

但是,我注意到请求仍然主要一次处理一个,因此该方法并没有比以前快多少。锁是否导致问题? ConnectionManager 是在一个对象中实例化并且每个线程都从同一对象调用 loadDocument 这一事实吗?

最佳答案

啊,没关系。我注意到锁包括对加载页面的方法的调用,因此一次只加载一个页面。

关于c# - 连续执行的多线程 WebRequests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34385883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com