ruby和赛璐珞
发布时间:2020-12-17 03:30:32 所属栏目:百科 来源:网络整理
导读:由于一些限制,我想将我当前的项目从EventMachine / EM-Synchrony切换到Celluloid,但是我很难与它联系.我正在编写的项目是一个网络收集器,它应该尽可能快地抓取大量页面. 为了对Celluloid的基本了解,我在本地Web服务器上生成了10.000个虚拟页面,并希望通过这
由于一些限制,我想将我当前的项目从EventMachine / EM-Synchrony切换到Celluloid,但是我很难与它联系.我正在编写的项目是一个网络收集器,它应该尽可能快地抓取大量页面.
为了对Celluloid的基本了解,我在本地Web服务器上生成了10.000个虚拟页面,并希望通过这个简单的Celluloid片段抓取它们: #!/usr/bin/env jruby --1.9 require 'celluloid' require 'open-uri' IDS = 1..9999 BASE_URL = "http://192.168.0.20/files" class Crawler include Celluloid def read(id) url = "#{BASE_URL}/#{id}" puts "URL: " + url open(url) { |x| x.read } end end pool = Crawler.pool(size: 100) IDS.to_a.map do |id| pool.future(:read,id) end 据我了解赛璐珞,期货是获取被激活请求响应的方式(与EventMachine中的回调相当),对吧?另一件事是,每个actor都在自己的线程中运行,所以我需要某种批处理请求,因为10.000线程会导致我的OSX开发机器出错. 所以创建一个游泳池是可行的,对吧?但是:上面的代码迭代了9999个URL,但只有1300个HTTP请求被发送到Web服务器.因此限制请求和迭代所有URL都会出错. 解决方法
一旦你的所有期货都被创建,你的程序就可能会退出.使用赛璐珞,未来将开始执行,但是在你对未来对象调用#value之前,你无法确定它是否完成.这也适用于池中的期货.您可能需要做的是将其更改为以下内容:
crawlers = IDS.to_a.map do |id| begin pool.future(:read,id) rescue DeadActorError,MailboxError end end crawlers.compact.each { |crawler| crawler.value rescue nil } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读