Pythonウォッチドッグファイル システム イベント ウォッチング ライブラリを使用すると、Windows Server 2003 で使用すると「ポーリング モード」になり、非同期 OS 通知の使用が停止し、大量のファイル変更が行われるとシステム パフォーマンスが大幅に低下することに気付きました。
ユーザーが監視対象のディレクトリまたはファイルの監視を停止したい場合に、コール ロックを停止するためにシステム コールが使用されるwatchdog/observers/winapi.py
ファイルまで問題を追跡しました。CancelIoEx
ReadDirectoryChangesW
(winapi.py)
CancelIoEx = ctypes.windll.kernel32.CancelIoEx
CancelIoEx.restype = ctypes.wintypes.BOOL
CancelIoEx.errcheck = _errcheck_bool
CancelIoEx.argtypes = (
ctypes.wintypes.HANDLE, # hObject
ctypes.POINTER(OVERLAPPED) # lpOverlapped
)
...
...
...
def close_directory_handle(handle):
try:
CancelIoEx(handle, None) # force ReadDirectoryChangesW to return
except WindowsError:
return
呼び出しの問題CancelIoEx
は、Windows Server 2008 まで利用できないことです:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363792(v=vs.85).aspx
考えられる代替手段の 1 つはclose_directory_handle
、監視対象のディレクトリ内にモック ファイルを作成するように変更することです。これReadDirectoryChangesW
により、返されるのを待っているスレッドのロックが解除されます。
CancelIo
しかし、システム コールがWindows Server 2003で実際に利用できることに気付きました。
指定されたファイルの呼び出しスレッドによって発行された、保留中のすべての入出力 (I/O) 操作を取り消します。この関数は、他のスレッドがファイル ハンドルに対して発行する I/O 操作をキャンセルしません。別のスレッドからの I/O 操作をキャンセルするには、CancelIoEx 関数を使用します。
ただし、呼び出しCancelIo
は待機中のスレッドには影響しません。
この問題を解決する方法について何か考えはありますか? これらのハンドラーから呼び出される各threading.enumerate()
スレッドによって処理されるシグナルを発行するために使用できますか?CancelIo