【问题标题】:Need help minimizing the loss of time for data collection需要帮助最大程度地减少数据收集时间的损失
【发布时间】:2019-07-10 13:21:49
【问题描述】:

我正在努力想出最好的方法来最大程度地减少我正在构建的数据收集应用程序中的时间损失。以下是一些限制/因素:

  • 我只能在特定通道上每 12 秒查询一次数据
  • 我可以同时连接到尽可能多的频道。
  • 我想将正在使用的频道数量保持在最低限度

考虑到这些因素,我想到了一个解决方案,但希望获得更多意见。

我决定以某种方式对这些数据集进行负载平衡。我的想法是这样的:

  • 主程序使用了 m 个进程(目前我在想 4 个)。
  • 每个进程使用 n 个线程,每个线程在一个通道上监听。(现在我想 12 个)。
  • 有一个变量thread_start_time_factor = 12 seconds / n threads
  • 有一个变量process_start_time_factor = thread_start_time_factor / m processes
  • 每个线程每 12 秒查询一次数据,但是线程根据thread_start_time_factor 一个接一个地连续启动。因此,如果我使用 12 个线程,线程 1 启动,(1 秒暂停),线程 2 启动,......这样数据收集现在每 1 秒发生一次。
  • 然后每个进程根据 process_start_time_factor

理论上,数据收集应该在每个process_start_time_factor 发生一次。如果采用上述配置,process_start_time_factor 应该是 0.250 秒。 (如果我的逻辑在这里是错误的,请告诉我)。

现在这是我的问题。这是一种的方法吗?我对使用多个进程的想法是基本上在其他进程没有时捕获数据。该程序将用 Python 编写(没关系)。有没有人有过这样的(奇怪的)数据收集限制的经验,他们必须跳出框框思考?感谢所有提前回复的人。我肯定愿意接受其他解决方案。

【问题讨论】:

  • 如果你真的可以写一些真正的代码来做这件事并提交给 codereview.stackexchange.com 可能会更好。也就是说,你为什么要使用这么多进程/线程?为什么不只使用两个并在时间用完之前在它们之间交替。还有什么是“频道”,为什么要切换?
  • @SamMason 我不想开始编写任何代码,除非我对此有一个好主意。我正在某个站点上收集数据,我可以每 12 秒发出一次请求,而不受速率限制。因此,每个频道本质上都是一个在代理上运行的网络会话。
  • 为什么不和网站管理员聊天呢?如今,未经许可让代码敲击网站通常被认为是不良形式,甚至是非法的
  • @SamMason 我已经阅读了他们的服务条款,它符合我想要做的事情。

标签: python multithreading web-scraping parallel-processing process


【解决方案1】:

鉴于您使用的是代理,未链接到该网站,并且对该问题有些模糊,这表明它接近非法

也就是说,您没有给出的一些数字是每个请求需要多长时间(例如 TTFB、总持续时间、传输的总数据)以及处理响应所需的时间。

假设您没有对 ingress 进行太多处理,那么我将采用 asyncio(即没有进程/线程并行性)方法,因为这样更容易直接进行协调。多线程/进程协调很难理解

您应该能够用来自单个线程的 HTTP 请求使 1GB 连接饱和,也许只是使用多个进程进行后处理,这样就不会妨碍

【讨论】:

    猜你喜欢
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2014-08-27
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多