返回信息流1. 在写一个爬虫,多线程请求多个url 和 单个线程请求多个url 效率上有区别吗?仅考虑下载内容,不考虑解析。
2. 使用线程池的话,如何判断一个pool中的某个线程是否已经结束?
最近想搞个多线程爬虫,已糊涂..... 请各位大神解惑,不胜感激
这是一条镜像帖。来源:北邮人论坛 / java / #40658同步于 2015/5/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[已解决」多线程的两个问题
dmlaomao
2015/5/12镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
1. 一般情况下,多线程会快。因为下载时间一般远远大于创建线程时间。
2. 不知道。不过好奇你为啥需要判断线程池的一个线程是否结束?那个应该是线程池管的事情。而且一个线程执行完任务之后可能会被线程池丢去执行新的任务。 如果你想要知道你提交的那个任务是否结束,可以用execute时候返回的那个Task。
【 在 dmlaomao 的大作中提到: 】
: 1. 在写一个爬虫,多线程请求多个url 和 单个线程请求多个url 效率上有区别吗?仅考虑下载内容,不考虑解析。
: 2. 使用线程池的话,如何判断一个pool中的某个线程是否已经结束?
: 最近想搞个多线程爬虫,已糊涂..... 请各位大神解惑,不胜感激
1. 差不多,理论上单线程polling最快,免去创建线程、操作系统线程切换的代价。在Java里对应的接口是nio里的Selector。但我不知道现有的哪个HTTP库是基于Selector的。如果不是10000个并发请求这个数量级的话,多线程更简单。
2. 用ExecutorService吧。它提供fork-join模型。你可以提交任务,任务被提交以后,就立即给你一个“Future”,这个对象可以让你判断这个任务是否结束了,也可以等待这个任务结束。使用这种模型的时候,你不需要提到“线程”,你只需要知道“任务提交了”而且“Future可以让我在以后拿到结果”就可以了。有可能这个ExecutorService是单线程的,也有可能是真的多线程的,但你不需要知道这个细节。看java.util.concurrent.ExecutorService接口和Future<T>类。
=。=唔,我以为lz单线程指的是一个一个同步慢慢来。。。
HTTP库的话,Netty, Apache的Httpclient也有一个支持async的,不过当时我看的时候还是alpha版。。
https://github.com/AsyncHttpClient/async-http-client
好像当时用过这个,基于Netty封装的。
Sorry,第二个那个不是Task。。。c井狗掩面跑开~~~~~~
【 在 dmlaomao 的大作中提到: 】
: 1. 在写一个爬虫,多线程请求多个url 和 单个线程请求多个url 效率上有区别吗?仅考虑下载内容,不考虑解析。
: 2. 使用线程池的话,如何判断一个pool中的某个线程是否已经结束?
: 最近想搞个多线程爬虫,已糊涂..... 请各位大神解惑,不胜感激
指的是epoll,no-blocking io?
【 在 nuanyangyang 的大作中提到: 】
: 1. 差不多,理论上单线程polling最快,免去创建线程、操作系统线程切换的代价。在Java里对应的接口是nio里的Selector。但我不知道现有的哪个HTTP库是基于Selector的。如果不是10000个并发请求这个数量级的话,多线程更简单。
: 2. 用ExecutorService吧。它提供fork-join模型。你可以提交任务,任务被提交以后,就立即给你一个“Future”,这个对象可以让你判断这个任务是否结束了,也可以等待这个任务结束。使用这种模型的时候,你不需要提到“线程”,你只需要知道“任务提交了”而且“Future可以让我在以后拿到结果”就可以了。有可能这个ExecutorService是单线程的,也有可能是真的多线程的,但你不需要知道这个细节。看java.util.concurrent.ExecutorService接口和Future<T>类。
下意识地看了下IP,论坛大神你好!
我记得之前有一篇nginx与Apache的性能对比文章,貌似就是说的这模型...
【 在 aiquestion 的大作中提到: 】
: =。=唔,我以为lz单线程指的是一个一个同步慢慢来。。。
: HTTP库的话,Netty, Apache的Httpclient也有一个支持async的,不过当时我看的时候还是alpha版。。
: https://github.com/AsyncHttpClient/async-http-client
: ...................
暖神,不太理解,单线程抓取会经常出现断线的问题,见过的爬虫也是采用多线程多一些,求解答!
【 在 nuanyangyang 的大作中提到: 】
: 1. 差不多,理论上单线程polling最快,免去创建线程、操作系统线程切换的代价。在Java里对应的接口是nio里的Selector。但我不知道现有的哪个HTTP库是基于Selector的。如果不是10000个并发请求这个数量级的话,多线程更简单。
: 2. 用ExecutorService吧。它提供fork-join模型。你可以提交任务,任务被提交以后,就立即给你一个“Future”,这个对象可以让你判断这个任务是否结束了,也可以等待这个任务结束。使用这种模型的时候,你不需要提到“线程”,你只需要知道“任务提交了”而且“Future可以让我在以后拿到结果”就可以了。有可能这个ExecutorService是单线程的,也有可能是真的多线程的,但你不需要知道这个细节。看java.util.concurrent.ExecutorService接口和Future<T>类。
南洋理工的大神?
【 在 renyi 的大作中提到: 】
: 下意识地看了下IP,论坛大神你好!
: 我记得之前有一篇nginx与Apache的性能对比文章,貌似就是说的这模型...
: