【发布时间】:2015-02-13 07:53:32
【问题描述】:
我正在开发一个网络爬虫。程序的每个线程尝试读取 3 个主机/秒(330ms 连接和读取超时)。每个线程的优先级为 10(Ubuntu 12.04)。
当我设置 10 个线程时,爬虫返回 150 个活着的主机(主机没有超时)。
当我设置 400 个线程时,爬虫只返回 20 个活着的主机。我不知道有多少主机是真正活着或存在的。
我的问题是,有没有可能一个线程在短时间内没有执行,并且当它确实需要时间继续(从 CPU 调度)时,套接字已经超时? (因为线程处理请求的时间过长)。
如果是这种情况,我必须设置多少个线程,以便所有线程都有相同的时间?
我使用的是 ubuntu 12.04 x64 - 桌面,4GB 内存,CPU i5
【问题讨论】:
-
只是出于好奇,你为什么要玩线程优先级?
-
当然,@fge 只是礼貌地问你一个关于优先级的问题,而不是马上告诉你别管线程优先级。
-
你所有的线程都应该得到尽可能多的时间,因为网络爬取不是 CPU 密集型的。但是,他们可能在需要时 得不到它。处理所有其他线程并返回第一个线程可能需要超过 330 毫秒。
-
发生的事情是您受 io 限制,您将网络负载增加了 40 倍,并且您的响应时间增加了。在这里,这不是真正的线程问题;您刚刚完成了经典的延迟/吞吐量权衡。
-
@MikeNakis 感谢您的告知!
标签: java multithreading