1

Pythonウォッチドッグファイル システム イベント ウォッチング ライブラリを使用すると、Windows Server 2003 で使用すると「ポーリング モード」になり、非同期 OS 通知の使用が停止し、大量のファイル変更が行われるとシステム パフォーマンスが大幅に低下することに気付きました。

ユーザーが監視対象のディレクトリまたはファイルの監視を停止したい場合に、コール ロックを停止するためにシステム コールが使用されるwatchdog/observers/winapi.pyファイルまで問題を追跡しました。CancelIoExReadDirectoryChangesW

(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

4

1 に答える 1