我們經常會遇到監控檔案變化的需求。例如日誌監控程式監控日誌檔案,一旦日誌檔案發生變化,就進行讀取。或者是大批量爬蟲的規則配置檔案監控,爬蟲本身持續執行,一旦規則檔案發生修改就自動讀取新的規則。
常見的做法,如果檔案比較小,可以直接讀取以後跟上次讀取的內容做對比;也可以判斷檔案的修改時間是否發生變化;也可以判斷檔案的 md5值是否發生變化。
但不論哪種方案,都需要不停輪詢檢查檔案。那有沒有不輪詢的方案呢?如果你的作業系統是 linux,那麼你可以使用 inotify 或者 asyncinotify。其中前者**是同步模式,後者基於 asyncio 實現非同步模式。他們都會在檔案發生變動的時候,主動通過乙個事件通知你,從而避免輪詢。我們以 inotify 為例。
python3 -m pip install inotify
from inotify.adapters importinotify
import
inotify.constants as mask
inotify =inotify()
inotify.add_watch(
'test.txt
', mask=mask.in_modify)
for event in inotify.event_gen(yield_nones=false):
print(event)
inotify.add_watch('test.txt
', mask=mask.in_modify)
inotify.add_watch(
'test2.txt
', mask=mask.in_modify)
inotify.add_watch(
'test3.txt
', mask=mask.in_modify)
執行效果如下圖所示:
檔案被修改:mask.in_modify
檔案被開啟:mask.in_open
檔案被關閉並有寫入:mask.in_close_write
檔案被關閉但是無寫入:mask.in_close_nowrite
檔案被刪除:mask.in_delete
這些變化,我們可以通過|
豎線來同時使用,例如:
inotify.add_watch('test.txt
', mask=mask.in_modify | mask.in_open) #
檔案被開啟或者被修改,就發出事件
可以看到,因為要修改或者讀取檔案的時候,必定會開啟檔案,所以當我們直接使用
cat test1.txt
的時候,依然會看到in_open
這個事件發生。如果想進一步了解inotify,可以訪問inotify 的 github[1]。
[1]inotify 的 github:
[2]asyncinotify 的官方文件:
持續更新 Vim一日一技
經常容易出現將 name 打成 nmae 的情況,如何快速的交換ma的位置呢?交換前後兩個字元 解釋 x 用於刪除單個字元,同時刪除的字元會進入快取,p既可以將快取的字元新增到游標後。多說一句,p是將字元新增到游標前。主要利用視覺化模式和 的選擇,以及a的插入模式。在每一行後面插入文字 更好的操作 ...
除錯斷言失敗 一日一技 python中的斷言
一 使用python中的斷言來自動檢測python程式中的錯誤,讓程式更加可靠且更易於除錯 從根本上來說,python中的斷言語句是一種除錯工具,用來測試某個斷言條件,如果斷言條件為true,則程式將繼續正常執行 但如果斷言條件為假false,則會引發assertionerror異常並顯示相關的錯誤...
擁有一技之長
在當今社會立足的根本是擁有一技之長。現在這個社會,沒有一項突出的技能,在各行各業激烈的競爭中想要立足,猶如是痴人說夢一般。未來怎麼樣我們很難下定論,但是不管未來怎麼變化,擁有一技之長總會讓自己有吃飯的資本。其次,有一技之長 有益於國家的繁榮昌盛,有益於我們個人生活品質的提高。放眼望向周圍的人,凡是對...