gpt4 book ai didi

multithreading - 任务数量未知的多线程

转载 作者:行者123 更新时间:2023-12-02 14:41:01 25 4
gpt4 key购买 nike

我正在为拥有越来越多实体的网站实现搜寻器。没有可用的信息,存在多少个实体,也没有所有实体的列表。可以使用如下URL来访问每个实体:http://www.somewebsite.com/entity_{i},其中{i}是实体的编号,从1开始并以1递增。

为了抓取每个实体,我正在运行一个循环,该循环检查HTTP请求是否返回200404。如果我收到404 NOT FOUND,循环将停止,并且我确定我具有所有实体。

串行方式如下所示:

def atTheEnd = false
def i = 0
while(!atTheEnd){
atTheEnd = !crawleWebsite("http://www.somewebsite.com/entity_" + i)
i++
}

如果成功, crawleWebsite()返回true,如果出现 404 NOT FOUND错误,则返回false。

问题是对那些实体进行爬网可能要花很长时间,这就是为什么我想在多个线程中进行爬网,但我不知道实体的总数,因此每个任务都不独立于其他任务。

解决此问题的最佳方法是什么?

我的方法是这样的:将二进制搜索与REST HEAD请求一起使用,以获取实体的总数(介于500到1000之间)并将它们拆分为一些线程。

也许有更好的方法吗?

tl;博士

基本上,我想告诉线程池以编程方式创建新任务,直到满足条件时(第一个 404出现时),然后等待直到每个任务完成为止。

注意:我正在使用 Grails 3实现此代码。

最佳答案

如您所说,实体的总数未知,可以成千上万。在这种情况下,即使您可能已经到达末尾,我也只想去一个固定的线程池并推测性地查询URL。考虑这个例子。

@Grab(group = 'org.codehaus.gpars', module = 'gpars', version = '1.2.1')
import groovyx.gpars.GParsPool

//crawling simulation - ignore :-)
def crawleWebsite(url) {
println "$url:${Thread.currentThread().name}"
Thread.sleep (1)
Math.random() * 1000 < 950
}

final Integer step = 50
Boolean atTheEnd = false
Integer i = 0
while (true) {
GParsPool.withPool(step) {
(i..(i + step)).eachParallel{atTheEnd = atTheEnd || !crawleWebsite("http://www.somewebsite.com/entity_" + it)}
}
if (atTheEnd) {
break
}
i += step
}

线程池设置为50,一旦所有50个URL均被爬网,我们将检查是否到达末尾。如果没有,我们继续。

显然,在最坏的情况下,您可以抓取50个 404。但我相信您可以摆脱它:-)

关于multithreading - 任务数量未知的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34924001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com