一日一技 不用輪詢,基於事件監控檔案變動

2022-10-08 18:21:18 字數 1736 閱讀 9212

我們經常會遇到監控檔案變化的需求。例如日誌監控程式監控日誌檔案,一旦日誌檔案發生變化,就進行讀取。或者是大批量爬蟲的規則配置檔案監控,爬蟲本身持續執行,一旦規則檔案發生修改就自動讀取新的規則。

常見的做法,如果檔案比較小,可以直接讀取以後跟上次讀取的內容做對比;也可以判斷檔案的修改時間是否發生變化;也可以判斷檔案的 md5值是否發生變化。

但不論哪種方案,都需要不停輪詢檢查檔案。那有沒有不輪詢的方案呢?如果你的作業系統是 linux,那麼你可以使用 inotify 或者 asyncinotify。其中前者**是同步模式,後者基於 asyncio 實現非同步模式。他們都會在檔案發生變動的時候,主動通過乙個事件通知你,從而避免輪詢。我們以 inotify 為例。

python3 -m pip install inotify

from inotify.adapters import

inotify

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異常並顯示相關的錯誤...

擁有一技之長

在當今社會立足的根本是擁有一技之長。現在這個社會,沒有一項突出的技能,在各行各業激烈的競爭中想要立足,猶如是痴人說夢一般。未來怎麼樣我們很難下定論,但是不管未來怎麼變化,擁有一技之長總會讓自己有吃飯的資本。其次,有一技之長 有益於國家的繁榮昌盛,有益於我們個人生活品質的提高。放眼望向周圍的人,凡是對...