2017-05-30 52 views
1

我有一個腳本下載了很多JSON。我正在處理下載的JSON文件,並將它們發送給其他某些功能。目前,我只是等待所有的JSON被下載,然後處理每個JSON。有沒有辦法做到這一點並行?就像下載每個JSON一樣,移動它以執行一些任務。儘快處理文件

我在考慮使用RabbitMQ,在完成下載之後向使用者發送JSON的路徑。我不知道如何確定是否下載了JSON並準備好使用它。

我看了其他的答案,但我找不到任何明確的。我只想了解如何繼續使用併發部分或如何將剛下載的JSON帶到下一個進程。

+0

您可以嘗試混合使用'threading'和'Queue'模塊。儘快提出請求,排隊並下載。 – brunormoreira

+0

謝謝,我會嘗試。但是下載過程中可能存在一個JSON?我將如何區分它與完全下載的,以便我不處理它? – Manohar

+0

嗯,我不知道你是如何執行請求。但我會創建一個列表,下載並啓動每個人的線索或加入一些,取決於您的優化技巧。之後,如果大於零,您可以繼續檢查「隊列」的大小並下載。懂了嗎? – brunormoreira

回答

1

使用某種消息隊列可以幫助乾淨地解決此問題,並解耦下載JSON並處理JSON。

在該設置中:

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

每個[]將代表一個獨立的進程和 - >將代表發送某種進程間的數據。

可以修改您的下載腳本以將每個文件保存到雲文件存儲服務,並在下載完成時發佈帶有該文件位置的消息。

然後可能有消費者進程從消息隊列中讀取並處理文件。

這將允許您處理每個文件,因爲它是下載。此外,它還可讓您分別縮放下載和處理步驟。

雖然這種模式非常普遍,但它具有操作複雜性。您將需要管理3個獨立的進程。

如果你想在一臺機器上運行此,你可以通過具有兩個獨立的進程在本地應用相同的模式:

  • [下載] - 寫入stdout
  • [process_json] - 從讀標準輸入和處理JSON

,那麼你可以使用操作系統的管道將它們鏈接download.py | process_json.py

download.py會下載文件並寫入文件路徑。而process_json將在單個文件路徑上運行。

+0

哇。萬分感謝!但是,download.py如何知道何時標記特定的JSON?我的意思是,我怎麼知道JSON已被完全下載,以便download.py可以標準化? 我的下載腳本[一個shell腳本]只是在一個命令中下載所有的JSON,所以我只是在完成下載後才知道每個JSON的使用方式。 – Manohar

+0

我實際上正在嘗試這個,我將有一個線程每秒檢查一次文件夾(下載JSON的文件夾),並檢查從現在開始,有多少JSON文件「最後修改」了一秒多,然後我認爲我可以安全地假設該文件已經完全下載並可以發送到進一步處理。 – Manohar

+0

@Manohar你如何下載腳本中的文件?應該有一種方法可以告訴腳本下載是否已經完全完成,或者有什麼異常的事情可以打斷它? – dm03514