我已经完成了使用beautifulsoup进行网页抓取并成功将解析后的数据保存到csv文件中,但我想加快这个过程,所以我使用了多处理。但是在脚本中应用多处理之后没有区别。这是我的代码
class Dummy
{
public static void main (String[] args) throws InterruptedException {
Dummy app = new Dummy();
int n=10;
for(int i=1; i<=n; i++)
{
System.out.println("--------------------------");
System.out.println("Total for n:" + i +" = " + app.mod(i));
}
}
private static int counter = 0;
public long mod(int n)
{
Dummy.counter++;
if(counter == 1)
{
long total = 0;
while(n>=0)
{
total += mod(n);
n--;
}
Dummy.counter--;
return total;
}
long result = 0;
long n1=0,n2=0;
if(n >= 2 && n <=3)
result++; //Increase 1
else if(n>3)
{
n1 = mod(n-1);
n2 = mod(n-2);
result = n1*n1 + n2*n2;
}
Dummy.counter--;
return result;
}
}
只需更新代码,现在的问题是CPU利用率只能在开始时达到100%,但很快就会下降到1%。我对此很困惑。
答案 0 :(得分:0)
不需要在代码中找到任何细节:您可以查看joblib模块。
<强>伪代码:强>
import joblib
if __name__ == "__main__":
URLs = ["URL1", "URL2", "URL2", ...]
Parallel(n_jobs=-1)(scrap(url,output_path) for url in URLs)
重构代码可能是必要的,因为如果没有代码在任何def:
和if __name__ == "__main__":
- 分支之外运行,则joblib才有效。
n_jobs=-1
将启动一系列与您计算机上的核心数相当的进程。有关详细信息,请参阅joblib&#39; documentation。
与selenium / geckodriver一起使用这种方法,根据您的机器,可能在不到一个小时的时间内刮掉一个10k URL的池(我通常在具有64GB ram的octacore机器上打开40-50个进程)。