首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于属性的动态限制队列的数据结构/算法

基于属性的动态限制队列的数据结构/算法
EN

Stack Overflow用户
提问于 2019-12-24 02:45:23
回答 1查看 24关注 0票数 0

我有一个堆栈(实现为数组),其中包含在套接字可用时发出的HTTP请求,但活动套接字的数量是有限的。我想将其扩展为每个主机的最大套接字数量(以及总套接字的最大数量,但这不是我在这里特别提出的问题)。

因此,队列应该继续按照它们被接收到的顺序进行处理。当然,如果队列中下一个请求的主机已达到最大套接字数量,则不可能为其提供服务,因此队列中未达到最大套接字数的下一个主机将被占用。

我考虑使用带有comparatorPriority Queue来检查主机上可用的最大套接字,但这并不能真正完成工作。我希望获得队列中可以服务的下一个队列,而不是基于套接字可用性作为优先级度量对队列进行重新排序。

我考虑过每个主机都有一个队列,但是很难保持原来的顺序。

我在考虑有一个单独的队列,每个项目上的主机的一个属性,以及一个例程来遍历队列,直到它找到第一个有可用套接字的队列,然后通过拼接将其出队。这保持了原来的顺序,但似乎效率很低。

因此,我正在考虑将这些方法与以下内容相结合(使用"order“属性维护整个队列):

代码语言:javascript
运行
复制
const queues = [
  {
    host: 'www.example.org',
    queue: [
      { order: 1 },
      { order: 3 }
    ]
  },
  {
    host: 'www.example.com',
    queue: [
      { order: 2 },
      { order: 4 },
      { order: 5 }
    ]
  }
];

使用上面的方法,当每个请求被添加到其主机的适当队列中时,将向每个请求添加一个order属性。然后,每次需要新项目时,都可以根据第一个项目的顺序值对主机队列集进行排序。然后,对下一项的检查只需要在每个主机上运行一次,而不是每次都扫描整个队列。

EN

回答 1

Stack Overflow用户

发布于 2019-12-25 22:12:57

我曾经为网络爬虫做过类似的事情。

我有一个Host类,其中包含有关主机的信息:名称、最大并发请求数、当前活动请求数、其robots.txt文件的副本、有关其历史记录的统计数据(我向其发出的请求数、平均响应速度、错误率等),以及其他特定于主机的信息。

我也有一个请求的优先级队列。每个请求结构都有要访问的URL,以及对相应Host实例的引用。优先级关键字是基于URL的值的优先级值(由机器学习算法计算,但在这里实际上并不相关)和时间的组合。

当我从队列中删除一个请求时,我要做的第一件事就是检查Host,看看是否有可用的套接字。如果不是,我会将请求重新排队,时间值为now +主机的平均请求时间。

这是有效的,尽管一些非常繁忙的主机的urls往往会被回收。

我对主机的优先级队列进行了试验。每个主机都有一个队列或URL。还有一个超时列表:由于各种原因当前处于“超时”状态的主机的字典,但主要是因为没有可用的套接字,或者它的URL队列为空。下面是它的工作原理:

主机将从优先级队列中移除,并发出请求。如果主机仍然有可用的套接字,那么我会将其添加回队列中。如果不是,它将进入超时队列。在这两种情况下,当请求完成时,主机的可用套接字数量将增加,该主机将从超时列表中删除并重新插入到优先级队列中。

这种方法看起来很有希望。当项目因为其他原因被取消时,我们正在测试它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59459953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档