【问题标题】:Process files as soon as they are downloaded下载文件后立即处理
【发布时间】:2017-05-30 12:12:47
【问题描述】:

我有一个下载大量 JSON 的脚本。我在下载 JSON 后处理它们,并将它们发送到其他一些功能。目前,我只是等到所有 JSON 都下载完毕,然后再处理它们。有没有办法并行执行此操作?就像,一旦每个 JSON 被下载,移动它来执行一些任务。

我正在考虑使用 RabbitMQ,它在完全下载后向消费者发送 JSON 的路径。我不知道如何确定 JSON 是否已下载并准备好使用它。

我查看了其他答案,但找不到任何明确的答案。我只是想知道如何继续并发部分或如何将刚刚下载的 JSON 带到下一个进程。

【问题讨论】:

  • 您可以尝试混合使用threadingQueue 模块。尽快提出请求、排队和下载。
  • 谢谢,我会试试的。但是可能有一个 JSON 正在下载过程中,对吧?我如何将它与完全下载的文件区分开来,以便我不处理它?
  • 好吧,我不知道您是如何实现这些请求的。但是我会创建一个列表,其中包含用于下载和启动每个线程的 URL 或加入一些,这取决于您的优化技能。之后,您可以继续检查Queue 的大小,如果大于零则下载。明白了吗?
  • 是的。我明白了要点。我会尝试。非常感谢您的帮助:)

标签: python json concurrency rabbitmq producer-consumer


【解决方案1】:

使用某种消息队列可以帮助彻底解决这个问题,并解耦下载 JSON 和处理 JSON。

在此设置中:

[download] -> [MQ] -> [process] -> ??

每个 [] 将代表一个单独的进程,而 -> 将代表发送某种进程间数据。

可以修改您的下载脚本以将每个文件保存到云文件存储服务,并在下载完成后发布一条包含该文件位置的消息。

然后可能会有一个消费者进程从消息队列中读取并处理文件。

这将允许您在下载每个文件时对其进行处理。此外,它还允许您分别扩展下载和处理步骤。

虽然这种模式很常见,但它带来了操作复杂性。您将需要管理 3 个独立的进程。

如果您想在一台机器上运行它,您可以通过两个单独的进程在本地应用相同的模式:

  • [下载] - 写入标准输出
  • [process_json] - 从标准输入读取并处理 json

然后你可以使用操作系统管道download.py | process_json.py链接它们

download.py 将下载文件并写入文件路径。并且 process_json 将在单个文件路径上运行。

【讨论】:

  • 哇。万分感谢!但是,download.py 是如何知道何时输出特定 JSON 的呢?我的意思是,我怎么知道 JSON 已经完全下载,以便 download.py 可以标准输出呢?我的下载脚本 [A shell script] 只是在一个命令中下载了所有 JSON,所以我只是对在完全下载后如何获取每个 JSON 感到困惑。
  • 我实际上正在尝试这个,我将有一个线程每秒检查一次文件夹(正在下载 JSON 的文件夹),并检查有多少 JSON 文件“最后修改”超过一个从现在开始,我想我可以放心地假设该文件已完全下载并可以发送到进一步处理。
  • @Manohar 您如何下载脚本中的文件?应该有办法从脚本中判断下载是否已完全完成,或者是否有异常中断?
猜你喜欢
  • 2012-06-09
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多