Vb.net 实现多线程爬虫

Vb.net 实现多线程爬虫,vb.net,multithreading,Vb.net,Multithreading,我想使用我现在拥有的单线程爬虫程序代码实现一个多线程爬虫程序。基本上,我从一个文本文件中读取URL,然后抓取并解析每个URL。我知道如何创建线程并为其分配进程,但不太确定如何以以下方式实现: 我需要至少3个线程,需要从url列表中为每个线程分配一个url,然后每个线程都需要在向数据库添加内容之前获取并解析它 Dim gthread, tthread, ithread As Thread gthread = New Thread(AddressOf processUrl)

我想使用我现在拥有的单线程爬虫程序代码实现一个多线程爬虫程序。基本上,我从一个文本文件中读取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


等待线程实例完成的最佳方法是调用.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设计用于非常高效地生成大量小任务

等待线程实例完成的最佳方法是调用.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设计用于非常高效地生成大量小任务

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

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

我建议使用a来完成此操作。

我建议使用a来完成此操作。

查看。我已经基于这个框架构建了一些爬虫程序,一旦您了解了CCR的工作原理,它就会使事情变得非常简单

您需要几个小时才能了解CCR的最新情况。

查看相关信息。我已经基于这个框架构建了一些爬虫程序,一旦您了解了CCR的工作原理,它就会使事情变得非常简单


您需要几个小时才能跟上CCR的进度。

JaredPar根据列表的大小,这可能会非常低效。此外,问题要求将其限制为3个线程。让我看看我是否理解-列表是可能的线程列表;然后,对于url列表中的每个url,创建一个新线程并为其分配函数processUrl,然后启动该线程并将其添加到可能的线程列表中。然后根据我所读的。join阻塞一个新线程,直到另一个线程完成。但我想让线程获取url,解析它,并同时添加到数据库中以加快进程?@Lucas B,本质上,任何手动线程管理都是不够的。许多线程的调度最好由像ThreadPool这样的API来决定,但是OP要求使用直线程实例。谢谢JaredPar,也感谢其他人的回复。现在看来还可以。好的,出现了一个问题。我有一个日志类,函数是我写的日志文件和错误文件。发生了与错误的冲突:进程无法访问该文件,因为另一个进程正在使用该文件。JaredPar根据列表的大小,这可能非常低效。此外,问题要求将其限制为3个线程。让我看看我是否理解-列表是可能的线程列表;然后,对于url列表中的每个url,创建一个新线程并为其分配函数processUrl,然后启动该线程并将其添加到可能的线程列表中。然后根据我所读的。join阻塞一个新线程,直到另一个线程完成。但我想让线程获取url,解析它,并同时添加到数据库中以加快进程?@Lucas B,本质上,任何手动线程管理都是不够的。许多线程的调度最好由像ThreadPool这样的API来决定,但是OP要求使用直线程实例。谢谢JaredPar,也感谢其他人的回复。现在看来还可以。好的,出现了一个问题。我有一个日志类,函数是我写的日志文件和错误文件。发生冲突并出现错误:进程无法访问该文件,因为另一个进程正在使用该文件。我将在其他时间研究此问题,谢谢。我现在几乎不懂线程。请原谅我不够聪明。我以后会调查的,谢谢。我现在几乎不懂线程。请原谅我不够聪明。