我有一个包含大量文本文件的文件夹列表。在这些文件中有链接。
使用这些链接中的每一个,我将需要获取一个网页,解析它,并根据那里的内容-将一个JPG文件保存到与包含提供链接的文本文件的文件夹名称对应的文件夹中。
现在的问题是,里面有很多文本文件和更多的链接。我在想,多线程连接和解析网页的过程可能不是一个坏主意。
所以我会有这样的东西:
directories.each do |directory|
...
all_files_in_directory.each do |file|
...
all_urls_in_file do |url|
# check if there's any threads that aren't busy
# make a thread go out to the url and parse it
end
end
end如果可能的话,我有点不确定该怎么做--我似乎找不到一种让线程挂起的方法,除非我告诉它们执行some_method()。这就好像一个线程所做的事情是在创建时分配给它的,并且不能改变。
因此,基本上我希望脚本能够连接和解析,比方说,以5个为一批,而不是只有1个。
这是可行的吗?如果可行,您将如何解决这个问题?
发布于 2012-04-20 09:42:02
对于并发的http请求,您应该考虑eventmachine和em-http-request。
发布于 2012-04-20 06:25:25
通常,这样的活动是通过将“任务”对象排队到正在等待生产者-消费者“池队列”的线程池来执行的。每个线程永远循环,将任务从队列中拉出,并调用任务的虚拟“run”方法。通常,如果它们愿意,任务可以创建更多的任务并将它们提交到池队列。
不同的“task”类子类可以有一个run()方法来做不同的事情&所以,即使线程确实“在创建时正在做分配给它的事情”--这意味着挂在队列上,然后,当任务可用时,在不同的任务中调用不同的重写方法。
流量控制,对。创建一个可以保存“批处理大小”urls的“batchURL”任务类。在开始时,创建..比方说..并将它们推送到“objectQueue”(一个类似于池队列的生产者-消费者队列类)。在您的readline循环中,弹出一个batchURL,用urls加载它,并将其提交到池队列。当池线程处理完batchURL后,将其推回到objectQueue上以供重用。这会限制未完成的batchURLs如果readLine尝试排队太多的batchURLs,它将发现objectQueue为空,因此将阻塞,直到一些batchURLs被池回收。
如果您使用合理数量的batchSIze、batchURL和线程,则batchURL应该在objectQueue/workThead/poolQueue循环中循环,以高效有效的方式将数据从您的readLine传递到工作线程。
https://stackoverflow.com/questions/10237477
复制相似问题