我想实现一个多步爬虫使用我现在拥有的单线程爬虫代码。基本上,我从文本文件中读取urls,获取每个urls,并对其进行爬行和解析。我知道如何创建线程和为其分配进程的线程基础知识,但不太确定如何实现以下方式:
我需要至少3个线程,需要分配一个网址列表中的每个线程的网址,然后每个需要去获取它和解析它之前,添加到数据库的内容。
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‘等等。
现在代码可能没有意义,但我需要做的是添加一个唯一的网址到每个线程的进程。
有什么好点子吗?
发布于 2010-02-02 01:28:18
等待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是为高效地产生大量小任务而设计的。
发布于 2010-02-02 01:28:46
您可以使用同步队列,在此队列中,您将URL推送到队列中,并且每个爬虫都会从该队列中取出它访问的下一个URL。当它们检测到新的URL时,也会将它们推入队列。
发布于 2010-02-02 01:30:50
我建议使用Background worker来完成此任务。
https://stackoverflow.com/questions/2178658
复制相似问题