我想使用我现在拥有的单线程爬虫代码实现一个多线程爬虫。基本上我从文本文件中读取url,取出每个url并抓取并解析它。我知道创建线程并为其分配进程的线程基础知识,但不太确定如何以下列方式实现:
我需要至少3个线程,并且需要从URL列表中为每个线程分配一个url,然后每个线程都需要去获取它并在将内容添加到数据库之前对其进行解析。
Dim gthread, tthread, ithread As Thread
gthread = New Thread(AddressOf processUrl)
gthread.Start(url)
tthread = New Thread(AddressOf processUrl))
tthread.Start(url)
ithread = New Thread(AddressOf processUrl))
ithread.Start(url)
WaitUntilAllAreOver:
If gthread.ThreadState = ThreadState.Running Then
Thread.Sleep(5)
GoTo WaitUntilAllAreOver
End If
“等。
现在代码可能没有意义,但我需要做的是为每个线程添加一个唯一的url进行处理。
赞赏任何想法
答案 0 :(得分:2)
等待Thread
实例完成的最佳方法是调用.Join方法。采取以下示例
Public Sub ParseAll(ByVal ParamArray urls As Uri())
Dim list as New List(Of Thread)
For Each url in urls
Dim thread = New Thread(AddressOf ProcessUrl)
thread.Start(url)
list.Add(thread)
Next
For Each thread in list
thread.Join
Next
End Sub
虽然你可能想考虑在这里使用ThreadPool
。 ThreadPool
旨在非常有效地产生大量小任务。
答案 1 :(得分:2)
您可以使用同步的队列来推送URL,并且每个抓取工具都会访问它从此队列中访问的下一个URL。当他们检测到新网址时,也会将其推送到队列中。
答案 2 :(得分:1)
我建议使用Background worker来完成此操作。
答案 3 :(得分:1)
查看Concurrency and Coordination Runtime (CCR)。我已经基于该框架构建了一些爬虫,一旦您了解了CCR的工作原理,它就会变得非常简单。
应该花几个小时才能加快CCR的速度。