Changelog

3.29.4 (2026-06-13)

  • keep the read/write heartbeat alive on a transient touch error PR #562 - by @dxbjavid

  • verify inode in break_lock_file before unlinking a stale lock PR #561 - by @dxbjavid

3.29.3 (2026-06-10)

  • 🐛 fix(ci): restore release environment on tag job PR #559

  • validate pid range in _parse_lock_holder PR #556 - by @dxbjavid

  • 🔧 ci(release): publish to PyPI on tag push PR #557

  • build(deps): bump astral-sh/setup-uv from 8.1.0 to 8.2.0 PR #558 - by @dependabot[bot]

3.29.2 (2026-06-10)

3.29.1 (2026-06-03)

3.29.0 (2026-04-19)

  • ✨ feat(soft): enable stale lock detection on Windows PR #534

  • 🐛 fix(async): use single-thread executor for lock consistency PR #533

  • build(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 PR #530 - by @dependabot[bot]

3.28.0 (2026-04-14)

  • 🐛 fix(ci): unbreak release workflow, publish to PyPI again PR #529

3.26.1 (2026-04-09)

  • 🐛 fix(asyncio): add __exit__ to BaseAsyncFileLock and fix __del__ loop handling PR #518 - by @naarob

  • build(deps): bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0 PR #525 - by @dependabot[bot]

3.26.0 (2026-04-06)

3.25.2 (2026-03-11)

  • 🐛 fix(unix): suppress EIO on close in Docker bind mounts PR #513

3.25.1 (2026-03-09)

3.25.0 (2026-03-01)

  • ✨ feat(async): add AsyncReadWriteLock PR #506

  • Standardize .github files to .yaml suffix

  • build(deps): bump actions/download-artifact from 7 to 8 PR #503 - by @dependabot[bot]

  • build(deps): bump actions/upload-artifact from 6 to 7 PR #502 - by @dependabot[bot]

  • Move SECURITY.md to .github/SECURITY.md

  • Add security policy

  • Add permissions to check workflow PR #500

  • [pre-commit.ci] pre-commit autoupdate PR #499 - by @pre-commit-ci[bot]

3.24.3 (2026-02-19)

  • 🐛 fix(unix): handle ENOENT race on FUSE/NFS during acquire PR #495

  • 🐛 fix(ci): add trailing blank line after changelog entries PR #492

3.24.2 (2026-02-16)

  • 🐛 fix(rw): close sqlite3 cursors and skip SoftFileLock Windows race PR #491

  • 🐛 fix(test): resolve flaky write non-starvation test PR #490

  • 📝 docs: restructure using Diataxis framework PR #489

3.24.1 (2026-02-15)

  • 🐛 fix(soft): resolve Windows deadlock and test race condition PR #488

3.24.0 (2026-02-14)

  • ✨ feat(lock): add lifetime parameter for lock expiration (#68) PR #486

  • ✨ feat(lock): add cancel_check to acquire (#309) PR #487

  • 🐛 fix(api): detect same-thread self-deadlock PR #481

  • ✨ feat(mode): respect POSIX default ACLs (#378) PR #483

  • 🐛 fix(win): eliminate lock file race in threaded usage PR #484

  • ✨ feat(lock): add poll_interval to constructor PR #482

  • 🐛 fix(unix): auto-fallback to SoftFileLock on ENOSYS PR #480

3.23.0 (2026-02-14)

  • 📝 docs: move from Unlicense to MIT PR #479

  • 📝 docs: add fasteners to similar libraries PR #478

3.22.0 (2026-02-14)

  • 🐛 fix(soft): skip stale detection on Windows PR #477

  • ✨ feat(soft): detect and break stale locks PR #476

3.21.2 (2026-02-13)

  • 🐛 fix: catch ImportError for missing sqlite3 C library PR #475

3.21.1 (2026-02-12)

  • 🐛 fix: gracefully handle missing sqlite3 when importing ReadWriteLock PR #473 - by @bayandin

  • 🐛 fix(ci): make release workflow robust

3.21.0 (2026-02-12)

  • 🐛 fix(ci): make release workflow robust

  • 👷 ci(release): commit changelog and use release config PR #472

  • 👷 ci(release): consolidate to two jobs PR #471

  • ✨ feat(unix): delete lock file on release PR #408 - by @sbc100

  • ✨ feat(lock): add SQLite-based ReadWriteLock PR #399 - by @leventov

  • 🔧 chore: modernize tooling and bump deps PR #470

v3.20.3 (2026-01-09)

v3.20.2 (2026-01-02)

  • Support Unix systems without O_NOFOLLOW PR #463.

v3.20.1 (2025-12-15)

  • Fix TOCTOU symlink vulnerability in lock file creation PR #461.

v3.20.0 (2025-10-08)

  • Add Python 3.14 support, drop 3.9 PR #448.

  • Add tox.toml to sdist PR #436.

v3.19.1 (2025-08-14)

v3.19.0 (2025-08-13)

  • Add support for Python 3.14 PR #432.

v3.18.0 (2025-03-11)

  • Support fcntl check on Emscripten PR #398.

  • Indicate that locks are exclusive/write locks PR #394.

v3.17.0 (2025-01-21)

v3.16.1 (2024-09-17)

v3.16.0 (2024-09-07)

v3.15.4 (2024-06-22)

  • Pass file_lock as positional argument PR #347.

v3.15.3 (2024-06-19)

  • Fix TypeError: _CountedFileLock.__init__() got an unexpected keyword argument PR #345.

v3.15.2 (2024-06-19)

  • Use a metaclass to implement the singleton pattern PR #340.

v3.15.1 (2024-06-12)

  • Restore __init__ method; more robust initialization for singleton locks PR #338.

v3.15.0 (2024-06-11)

  • Add asyncio support PR #332.

  • Don’t re-initialize BaseFileLock when returning existing singleton instance PR #334.

v3.14.0 (2024-04-27)

  • Add blocking parameter on lock constructor PR #325.

v3.13.4 (2024-04-09)

  • Raise error on incompatible singleton timeout and mode arguments PR #320.

v3.13.3 (2024-03-25)

  • Make singleton class instance dict unique per subclass PR #318.

v3.13.2 (2024-03-25)

  • Fix permission denied error when lock file is placed in /tmp PR #317.

v3.13.1 (2023-10-30)

  • Allow users to subclass FileLock with custom keyword arguments PR #284.

v3.13.0 (2023-10-27)

  • Support reentrant locking on lock file path via optional is_singleton instance PR #283.

v3.12.4 (2023-09-13)

  • Change typing-extensions to be installed only with the [typing] extra PR #276.

v3.12.3 (2023-08-28)

  • Add tox.ini to sdist PR #265.

  • Create parent directories if necessary PR #254.

v3.12.2 (2023-06-12)

  • Restore if TYPE_CHECKING syntax for FileLock definition PR #245.

v3.12.1 (2023-06-10)

v3.12.0 (2023-04-18)

  • Make the thread local behavior something the caller can enable/disable via a flag during the lock creation, it’s on by default.

  • Better error handling on Windows.

v3.11.0 (2023-04-06)

  • Make the lock thread local.

v3.10.7 (2023-03-27)

  • Use fchmod instead of chmod to work around bug in PyPy via Anaconda.

v3.10.6 (2023-03-25)

  • Enhance the robustness of the try/catch block in _soft.py. by @jahrules.

v3.10.5 (2023-03-25)

  • Add explicit error check as certain UNIX filesystems do not support flock. by @jahrules.

v3.10.4 (2023-03-24)

  • Update os.open to preserve mode= for certain edge cases. by @jahrules.

v3.10.3 (2023-03-23)

v3.10.2 (2023-03-22)

  • Bug fix for using filelock with threaded programs causing undesired file permissions - by @jahrules.

v3.10.1 (2023-03-22)

v3.10.0 (2023-03-15)

v3.9.1 (2023-03-14)

  • Use time.perf_counter instead of time.monotonic for calculating timeouts.

v3.9.0 (2022-12-28)

v3.8.1 (2022-12-04)

  • Fix mypy does not accept filelock.FileLock as a valid type

v3.8.0 (2022-12-04)

  • Bump project dependencies

  • Add timeout unit to docstrings

  • Support 3.11

v3.7.1 (2022-05-31)

  • Make the readme documentation point to the index page

v3.7.0 (2022-05-13)

  • Add ability to return immediately when a lock cannot be obtained

v3.6.0 (2022-02-17)

v3.5.1 (2022-02-16)

  • Use time.monotonic instead of time.time for calculating timeouts.

v3.5.0 (2022-02-15)

  • Enable use as context decorator

v3.4.2 (2021-12-16)

  • Drop support for python 3.6

v3.4.1 (2021-12-16)

  • Add stacklevel to deprecation warnings for argument name change

v3.4.0 (2021-11-16)

  • Add correct spelling of poll interval parameter for acquire method, raise deprecation warning when using the misspelled form PR #119 - by @XuehaiPan.

v3.3.2 (2021-10-29)

  • Accept path types (like pathlib.Path and pathlib.PurePath) in the constructor for FileLock objects.

v3.3.1 (2021-10-15)

v3.3.0 (2021-10-03)

v3.2.1 (2021-10-02)

  • Improve documentation

  • Changed logger name from filelock._api to filelock PR #97 - by @hkennyv

v3.2.0 (2021-09-30)

v3.1.0 (2021-09-27)

v3.0.12 (2019-05-18)

  • fixed setuptools and twine/warehouse error by making the license only 1 line long

  • update version for pypi upload

  • fixed python2 setup error

  • added test.py module to MANIFEST and made tests available in the setup commands issue #48

  • fixed documentation thanks to @AnkurTank issue #49

  • Update Trove classifiers for PyPI

  • test: Skip test_del on PyPy since it hangs

v3.0.10 (2018-11-01)

  • Fix README rendering on PyPI

v3.0.9 (2018-10-02)

  • PR #38 from cottsay/shebang

  • updated docs config for older sphinx compatibility

  • removed misleading shebang from module

v3.0.8 (2018-09-09)

  • updated use setuptools

v3.0.7 (2018-09-09)

  • fixed garbage collection (issue #37)

  • fix travis ci badge (use rst not markdown)

  • changed travis uri

v3.0.6 (2018-08-22)

  • clean up

  • Fixed unit test for Python 2.7

  • Added Travis banner

  • Added Travis CI support

v3.0.5 (2018-04-26)

  • Corrected the prequel reference

v3.0.4 (2018-02-01)

  • updated README

v3.0.3 (2018-01-30)

  • updated readme

v3.0.1 (2018-01-30)

  • updated README (added navigation)

  • updated documentation issue #22

  • fix the SoftFileLock test was influenced by the test for FileLock

  • undo cb1d83d issue #31

v3.0.0 (2018-01-05)

  • updated major version number due to issue #29 and issue #27

  • fixed use proper Python3 reraise method

  • Attempting to clean up lock file on Unix after release

v2.0.13 (2017-11-05)

  • changed The logger is now acquired when first needed. issue #24

v2.0.12 (2017-09-02)

  • correct spelling mistake

v2.0.11 (2017-07-19)

  • added official support for python 2 issue #20

v2.0.10 (2017-06-07)

  • updated readme

v2.0.9 (2017-06-07)

  • updated readme issue #19

  • added example PR #16

  • updated readthedocs url

  • updated change order of the examples (PR #16)

v2.0.8 (2017-01-24)

  • Added logging

  • Removed unused imports

v2.0.7 (2016-11-05)

  • fixed issue #14 (moved license and readme file to MANIFEST)

v2.0.6 (2016-05-01)

  • changed unlocking sequence to fix transient test failures

  • changed threads in tests so exceptions surface

  • added test lock file cleanup

v2.0.5 (2015-11-11)

  • Don’t remove file after releasing lock

  • updated docs

v2.0.4 (2015-07-29)

  • added the new classes to __all__

v2.0.3 (2015-07-29)

  • added The SoftFileLock is now always tested

v2.0.2 (2015-07-29)

  • The filelock classes are now always available and have been moved out of the if msvrct: ... elif fcntl ... else clauses.

v2.0.1 (2015-06-13)

  • fixed issue #5

  • updated test cases

  • updated documentation

  • fixed issue #2 which has been introduced with the lock counter

v2.0.0 (2015-05-25)

  • added default timeout (fixes issue #2)

v1.0.3 (2015-04-22)

  • added new test case, fixed unhandled exception

v1.0.2 (2015-04-22)

  • fixed a timeout could still be thrown if the lock is already acquired

v1.0.1 (2015-04-22)

v1.0.0 (2015-04-07)

  • added lock counter, added unittest, updated to version 1

  • changed filenames

  • updated version for pypi

  • updated README, LICENSE (changed format from md to rst)

  • added MANIFEST to gitignore

  • added os independent file lock ; changed setup.py for pypi

  • Update README.md

  • initial version