我正在开发一个网络爬虫。程序的每个线程尝试读取3个主机/秒(330ms连接和读取超时)。每个线程的优先级为10(Ubuntu 12.04)。
当我设置10个线程时,爬虫返回150个主机(主机没有超时)。
当我设置400个线程时,爬虫只返回20个主机。我不知道有多少主机真的存在或存在。
我的问题是,是否有可能,一个线程没有在短时间内执行,以及何时它确实需要时间来继续(从CPU调度)套接字已经超时? (因为线程花了太长时间来处理请求)。
如果是这种情况,我必须设置多少个线程,所以所有线程都有相同的时间?
我使用的是ubuntu 12.04 x64 - 桌面,4GB Ram,CPU i5
答案 0 :(得分:2)
感觉您需要了解Amdahl's Law。基本上,对于N个线程,你的运算速度会小于N倍。您只有一个i5,它可以同时支持2到4个并行任务。由于驱动线程的成本,线程之间的切换以及(如果你没有使用调度程序或线程池)破坏线程,因此在系统上投入的线程比你的系统能够真正处理bogs性能下降更多。
您也无法保证相同的执行时间,因为您依赖外部因素,例如打开该服务器的套接字,以及服务器自身的连接速度。将有比其他服务器慢的服务器,这意味着线程从套接字读取的总时间将比其他服务器慢。
我不能肯定地说你的性能因为推测的IO而变得严重,但我建议进行性能分析和测试。在系统上设置尽可能多的线程,然后在那里工作。尽可能详细地描述您的代码。向它投掷更多线程不是个好主意。