并行化
Hawk支持单机并行化,也就是使用多线程获取数据。它可以控制目前所有任务的数量,为了不给网站造成过大的压力,仅当任务池中的任务数量小于一定值后,才会插入新的任务。
在调试模式下,所有获取都是串行的。而执行模式下,执行器才会执行。为了更好地理解并行化,强烈建议阅读下面的内容。
最简单的并行化
我们以抓取某个网站的100个页面为例,第一个模块生成区间数
,可以生成1-100的页面,自然地,就可以创建100个任务,分别抓取了。
Hawk在默认情况下,会以本流程的第一个模块生成的元素数量,作为创建任务的数量。
但是,但如果队首的生成器只生成了很少的元素,每个元素在后期,又会转换为大量的元素,那么这种方法就非常低下了。极端情况下队首生成器只生成一个元素,则并行化就毫无意义:
改进的并行
一种非常简单的思路,是将其切成两个流,并行在流中完成。
我们将其看成两个流,第一个流,负责产生出一堆种子任务出来,并加入到任务队列,之后再在这些任务的基础上,再分别调用第二个流。
如何切分流?取决于你在流中插入的并行
的位置。这个位置就是切分为两个流的“切割点”。
以大众点评为例, 北京有14个区县,有30种美食类型,如果直接在区县后插入并行,则只有14个子任务,任务数量太少:那么先通过流1,获取420个元素,再以420个元素的基础上,插入并行,这样速度就快很多了。你也可以在14个区县之后插入并行化,那么就有14个子任务
反过来,如果每个任务的工作量太少,比如只访问一次网站内容,则这样的种子创建并行就显得过分地成本高昂,因此可以填写分组并行数量,比如10,那么Hawk就会以10个元素为一组,创建任务。
监控任务执行情况
任务管理器中,可以显示任务的名称,以及进度。这样可以方便监控。
子线程名称和子线程数量,都支持直接写值,或使用方括号表达式来获取别的列的内容。例如,如果你确定每个子任务都会获取100条数据,就可以在子线程数量
中填写100
,之后当该任务获取了50个元素时,进度条正好处在50%的位置。如果有一列名为“小区名”, 则可以在子线程名称
栏目中填写[小区名]
,Hawk就会把小区名列中的内容作为子任务的名称。
任务管理
你可以随时在执行过程中,暂停或取消所有任务。
五个按钮依次为:全选,反选,暂停,启动,删除。
你可以不告诉Hawk子任务的名称,那么它就是默认值。