Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Ruby并发处理web页面_Ruby_Concurrency_Parallel Processing - Fatal编程技术网

用Ruby并发处理web页面

用Ruby并发处理web页面,ruby,concurrency,parallel-processing,Ruby,Concurrency,Parallel Processing,我试图使用rubyThread处理给定URL数组的不同页面的内容。但是,当尝试打开URL时,我总是会遇到以下错误:# 这就是我试图做到的: sites.each do |site| threads << Thread.new(site) do |url| puts url #web = open(url) { |i| i.read } # same issue opening the web this way web = Net

我试图使用ruby
Thread
处理给定URL数组的不同页面的内容。但是,当尝试打开URL时,我总是会遇到以下错误:
#

这就是我试图做到的:

sites.each do |site|
    threads << Thread.new(site) do |url|
        puts url
        #web = open(url) { |i| i.read } # same issue opening the web this way
        web = Net::HTTP.new(url, 443).get('/', nil)
        lock.synchronize do
            new_md5[sites_hash[url]] = Digest::MD5.hexdigest(web)
        end
    end
end

有什么问题吗?

啊。你要为每个需要处理的站点打开一个线程吗?如果你有10000个站点呢

相反,设置线程数量限制,并将
站点
转换为一个,让每个线程删除一个站点,处理它并获得另一个站点。如果队列中没有其他站点,则线程可以退出

队列文档中的示例将帮助您开始

不要使用
get
并始终检索整个正文,而是使用一个跟踪页面上次处理时间的备份数据库。用于检查页面自那时起是否已更新。如果有,则执行
get
。这将减少您和他们的带宽和CPU使用。这一切都是关于成为一个好的网络公民,和他人的玩具玩得开心。如果你玩得不好,他们可能不会让你再和他们玩了

我已经编写了数百个spider和站点分析器。我建议你应该始终拥有一个备份数据库,并使用它来跟踪你将要阅读的网站、你上次阅读它们的时间、你上次尝试获取页面时它们是向上还是向下,以及你尝试访问它们和它们向下的次数。(最后一个是为了避免你的代码在试图到达死角/死角的时候撞到墙上。)

我有一个75线程的应用程序,可以阅读网页。每个线程都将其发现写入数据库,如果需要处理某个页面,则将该HTML写入另一个表中的记录。然后,一个应用程序读取该表并进行处理。一个应用程序很容易领先于75个线程,因为他们正在应对缓慢的互联网

使用后端数据库的最大优势在于,您的代码可以被关闭,并且如果您编写正确,它将在同一个位置(下一个要处理的站点)被接收。您还可以轻松地将其扩展到在多台主机上运行


关于找不到主机:

我在您的代码中看到了一些东西:

  • 你没有处理重定向。“”演示了如何做到这一点
  • 请求是到端口443,而不是80,因此Net::HTTP不愿意尝试使用非SSL到SSL端口。请参阅“”,其中讨论了如何打开SSL
这两种方法都可以解释为什么使用
open
有效,而您的代码无效。(我假设您将OpenURI与单线程代码结合使用,尽管您没有显示它,因为
open
本身不知道如何处理URL。)



一般来说,我建议使用来并行处理大量站点。Typhous还将为您处理重定向,同时允许您使用
head
请求。您还可以设置同时处理多少请求(并发),并自动处理重复请求(记忆),这样冗余URL就不会受到冲击。

Ugh。你要为每个需要处理的站点打开一个线程吗?如果你有10000个站点呢?设置线程数量限制,将
站点
变成一个队列,让每个线程删除一个站点,处理它并获得另一个站点。如果队列中没有其他站点,那么线程可以退出。我有java并发方面的经验,这里的列表只有5个线程。。。我只是想知道为什么在网络开放的时候我会遇到这个问题什么版本的Ruby?
sites.each { |site|
    web = open(site) { |i| i.read }
    new_md5 << Digest::MD5.hexdigest(web)
}