首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现多线程爬虫

实现多线程爬虫
EN

Stack Overflow用户
提问于 2010-02-02 01:23:22
回答 4查看 559关注 0票数 1

我想实现一个多步爬虫使用我现在拥有的单线程爬虫代码。基本上,我从文本文件中读取urls,获取每个urls,并对其进行爬行和解析。我知道如何创建线程和为其分配进程的线程基础知识,但不太确定如何实现以下方式:

我需要至少3个线程,需要分配一个网址列表中的每个线程的网址,然后每个需要去获取它和解析它之前,添加到数据库的内容。

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
        If gthread.ThreadState = ThreadState.Running Then
            Thread.Sleep(5)
            GoTo WaitUntilAllAreOver
        End If

‘等等。

现在代码可能没有意义,但我需要做的是添加一个唯一的网址到每个线程的进程。

有什么好点子吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-02 01:28:18

等待Thread实例完成的最佳方法是调用.Join方法。以下面的例子为例

代码语言:javascript
运行
复制
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

不过,您可能需要考虑在这里使用ThreadPoolThreadPool是为高效地产生大量小任务而设计的。

票数 2
EN

Stack Overflow用户

发布于 2010-02-02 01:28:46

您可以使用同步队列,在此队列中,您将URL推送到队列中,并且每个爬虫都会从该队列中取出它访问的下一个URL。当它们检测到新的URL时,也会将它们推入队列。

票数 2
EN

Stack Overflow用户

发布于 2010-02-02 01:30:50

我建议使用Background worker来完成此任务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2178658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档