我有一个堆栈(实现为数组),其中包含在套接字可用时发出的HTTP请求,但活动套接字的数量是有限的。我想将其扩展为每个主机的最大套接字数量(以及总套接字的最大数量,但这不是我在这里特别提出的问题)。
因此,队列应该继续按照它们被接收到的顺序进行处理。当然,如果队列中下一个请求的主机已达到最大套接字数量,则不可能为其提供服务,因此队列中未达到最大套接字数的下一个主机将被占用。
我考虑使用带有comparator的Priority Queue来检查主机上可用的最大套接字,但这并不能真正完成工作。我希望获得队列中可以服务的下一个队列,而不是基于套接字可用性作为优先级度量对队列进行重新排序。
我考虑过每个主机都有一个队列,但是很难保持原来的顺序。
我在考虑有一个单独的队列,每个项目上的主机的一个属性,以及一个例程来遍历队列,直到它找到第一个有可用套接字的队列,然后通过拼接将其出队。这保持了原来的顺序,但似乎效率很低。
因此,我正在考虑将这些方法与以下内容相结合(使用"order“属性维护整个队列):
const queues = [
{
host: 'www.example.org',
queue: [
{ order: 1 },
{ order: 3 }
]
},
{
host: 'www.example.com',
queue: [
{ order: 2 },
{ order: 4 },
{ order: 5 }
]
}
];使用上面的方法,当每个请求被添加到其主机的适当队列中时,将向每个请求添加一个order属性。然后,每次需要新项目时,都可以根据第一个项目的顺序值对主机队列集进行排序。然后,对下一项的检查只需要在每个主机上运行一次,而不是每次都扫描整个队列。
发布于 2019-12-25 22:12:57
我曾经为网络爬虫做过类似的事情。
我有一个Host类,其中包含有关主机的信息:名称、最大并发请求数、当前活动请求数、其robots.txt文件的副本、有关其历史记录的统计数据(我向其发出的请求数、平均响应速度、错误率等),以及其他特定于主机的信息。
我也有一个请求的优先级队列。每个请求结构都有要访问的URL,以及对相应Host实例的引用。优先级关键字是基于URL的值的优先级值(由机器学习算法计算,但在这里实际上并不相关)和时间的组合。
当我从队列中删除一个请求时,我要做的第一件事就是检查Host,看看是否有可用的套接字。如果不是,我会将请求重新排队,时间值为now +主机的平均请求时间。
这是有效的,尽管一些非常繁忙的主机的urls往往会被回收。
我对主机的优先级队列进行了试验。每个主机都有一个队列或URL。还有一个超时列表:由于各种原因当前处于“超时”状态的主机的字典,但主要是因为没有可用的套接字,或者它的URL队列为空。下面是它的工作原理:
主机将从优先级队列中移除,并发出请求。如果主机仍然有可用的套接字,那么我会将其添加回队列中。如果不是,它将进入超时队列。在这两种情况下,当请求完成时,主机的可用套接字数量将增加,该主机将从超时列表中删除并重新插入到优先级队列中。
这种方法看起来很有希望。当项目因为其他原因被取消时,我们正在测试它。
https://stackoverflow.com/questions/59459953
复制相似问题