1 回答

TA貢獻1815條經(jīng)驗 獲得超6個贊
事情不是這樣的。
在我的腦海中,我可以想到這些選項:
如果兩個 goroutine 都在同一個程序中工作,那么問題不大:讓“生產(chǎn)者”goroutine 將其已完成修改的文件的名稱注冊到某個注冊表中,并讓“消費者”goroutine 從該注冊表中讀?。ê蛣h除) .
在最簡單的情況下,它可能是一個緩沖通道。
如果生產(chǎn)者的工作速度比消費者快得多,并且您不想出于某種原因阻止前者,那么由互斥鎖保護的切片將符合要求。
如果 goroutines 在同一臺機器上的不同進程中工作,但您控制兩個程序,則讓生產(chǎn)者進程通過任何合適的 IPC 將相同的數(shù)據(jù)傳遞給消費者進程。
執(zhí)行 IPC 的哪種方法更好取決于進程如何啟動、交互等。
有多種選擇。
如果您控制兩個進程但不想弄亂它們之間的 IPC(也有原因),那么讓生產(chǎn)者遵循關(guān)于如何編寫文件的最佳實踐(稍后會詳細介紹),并讓消費者使用任何文件系統(tǒng)監(jiān)控工具,用于報告生產(chǎn)者生成(“出現(xiàn)”)哪些文件。你可以從
github.com/fsnotify/fsnotify
.為了正確地寫入文件,生產(chǎn)者必須將其數(shù)據(jù)寫入臨時文件——即位于同一目錄中但具有易于理解的文件名以指示該文件尚未完成的文件——例如, “.foobar.data.part”或“foobar.data.276gd14054.tmp”可以寫入“foobar.data”。(存在其他方法,但這個方法足以作為開始。)
一旦文件準備就緒,制作者必須將文件從其臨時名稱重命名為其“正確的”最終名稱。此操作在所有合理的操作系統(tǒng)/文件系統(tǒng)上都是原子的,并使文件從消費者的 PoV 原子地“跳入存在狀態(tài)”。例如,
inotify
在 Linux 上為這樣的出現(xiàn)生成一個類型為“moved to”的事件。如果您不想自己做正確的事情,
github.com/dchest/safefile
這是一個很好的跨平臺開始。正如您所看到的,通過這種方法,您知道文件已經(jīng)完成,僅從它被報告到已經(jīng)出現(xiàn)的事實。
如果您不控制生產(chǎn)者,您可能需要求助于猜測。
最簡單的是再次監(jiān)視文件系統(tǒng)的事件——但這次是“文件更新”事件,而不是“文件創(chuàng)建”事件。對于報告為已更新的每個文件,您必須記住該事件的時間戳,并且當經(jīng)過一定時間后,您可以聲明該文件是由制作者完成的。
IMO 這種方法是最糟糕的,但如果你沒有更好的選擇,它至少是一種選擇。
- 1 回答
- 0 關(guān)注
- 141 瀏覽
添加回答
舉報