我正在开发一个网络爬虫。程序的每个线程尝试读取3主机/秒(330 of连接和读取超时)。每个线程的优先级为10 (Ubuntu12.04)。
当我设置10个线程时,爬虫将返回150个活动主机(主机没有超时)。
当我设置400个线程时,爬虫只返回20个活着的主机。我不知道到底有多少个主机还活着或存在。
我的问题是,线程是否有可能在短时间内没有执行,并且当它确实需要时间继续(从CPU调度)套接字到已经超时?(因为线程处理请求花费的时间太长)。
如果是这样的话,我需要设置多少线程,所以所有线程都有相同的时间?
我使用的是一个ubuntu12.04 x64 -桌面,4GB内存,CPU i5
发布于 2015-02-12 23:53:32
感觉好像你需要对Amdahl定律有一个了解。基本上,对于N个线程,您的操作将比N倍的加速要少得多。您只有一个i5,它可以同时支持2到4个并行任务。抛出比您的系统更多的线程实际上可以处理瓶颈性能下降,因为旋转线程、在线程之间切换以及(如果您没有使用调度程序或线程池)破坏线程的成本。
您也不能保证相同的执行时间,因为您依赖于外部因素,如打开到该服务器的套接字,以及服务器自身的连接速度。会有比其他服务器慢的服务器,这意味着线程从套接字读取的总时间将比其他线程慢。
我不能肯定地说,您的性能正因为IO的推测而陷入困境,但我建议您进行分析和测试。在您的系统上设置尽可能多的线程,并在那里工作。尽可能最好地分析您的代码。向它扔更多的线程不是个好主意。
https://stackoverflow.com/questions/28489969
复制相似问题