如果不是最大值还是有效的?
我正在创建14个线程,每个线程打开一个URL列表(约500个)为每个线程创建一个新的线程,然后将其下载,并将其添加到MySQL数据库. MySQL池大小设置为50.
这是RoR中的耙子任务.
这样会使用Kernal#fork或其他方法更好吗?
解决方法
那么,由于你的线程将是IO绑定,所以好消息是,Ruby 1.8和1.9线程都可以实现. Ruby 1.8使用“用户空间线程”,这意味着在Ruby中创建新线程时不会创建真正的新操作系统线程.这对于cpu多任务是不利的,因为一次只有一个Ruby线程正在运行,但对于IO多任务是有好处的. Ruby 1.9使用真正的线程,并且对于这两者都是有好处的.
您可以创建的线程数确实取决于您的系统.当然有实际的限制,但是你可能不想在任何地方附近.首先,除非您下载的服务器速度非常慢,而且连接速度非常快,否则只有几个线程会使您的Internet连接饱和.另外,如果你从一个服务器上抓取了很多页面,那么从500个线程一次就可以一次抛出500个请求也不会有什么好处的.
我会开始很小:10或20个线程一次运行.根据服务器负载,带宽等增加或减少.还有与MysqL数据库并发连接的问题.根据您的表的设置以及它们的大小,尝试在同一时间插入太多的数据将无法正常工作.