-
-
Notifications
You must be signed in to change notification settings - Fork 128
Closed
Labels
Description
Hi,
On Windows 10.0.19041.687 Pro x64.
Python 3.7.0: x64.
Here is a test script:
import tempfile
import pathlib
import threading
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
from filelock import FileLock
import time
TEST_FILE = pathlib.Path(tempfile.gettempdir()) / 'test_file.txt'
TEST_LOCK_FILE = pathlib.Path(tempfile.gettempdir()) / 'test_file.txt.lock'
LOCK = FileLock(TEST_LOCK_FILE)
def test():
with LOCK:
assert TEST_FILE.read_text() == 'hi'
TEST_FILE.write_text('')
assert TEST_FILE.read_text() == ''
TEST_FILE.write_text('hi')
assert TEST_FILE.read_text() == 'hi'
return True
if __name__ == '__main__':
print(f"Test file: {TEST_FILE}")
print(f"Test lock file: {TEST_LOCK_FILE}")
TEST_FILE.write_text('hi')
results = []
# works with ProcessPoolExecutor but not with ThreadPoolExecutor
# It also is more likely to work if we sleep after calling submit()
with ThreadPoolExecutor(max_workers=16) as pool:
for i in range(100):
if i % 10 == 0:
print (f"Loop: {i+1}")
results.append(pool.submit(test))
for idx, result in enumerate(results):
print (f"Checking result: {idx + 1}")
assert result.result() == True
Example run:
PS C:\Users\csm10495\Desktop> python .\file_lock_test.py
Test file: C:\Users\csm10495\AppData\Local\Temp\test_file.txt
Test lock file: C:\Users\csm10495\AppData\Local\Temp\test_file.txt.lock
Loop: 1
Loop: 11
Loop: 21
Loop: 31
Loop: 41
Loop: 51
Loop: 61
Loop: 71
Loop: 81
Loop: 91
Checking result: 1
Traceback (most recent call last):
File ".\file_lock_test.py", line 38, in <module>
assert result.result() == True
File "C:\Python37\lib\concurrent\futures\_base.py", line 425, in result
return self.__get_result()
File "C:\Python37\lib\concurrent\futures\_base.py", line 384, in __get_result
raise self._exception
File "C:\Python37\lib\concurrent\futures\thread.py", line 57, in run
result = self.fn(*self.args, **self.kwargs)
File ".\file_lock_test.py", line 18, in test
assert TEST_FILE.read_text() == 'hi'
AssertionError
Using a ThreadPoolExecutor seems to lead to assertion errors making me think the lock file wasn't atomically created. If I sleep a bit (like .01), after doing submit() it seems to work, but sort of defeats the purpose of the test.
Reactions are currently unavailable