Я создаю большой файл с моим python script (более чем 1GB
, на самом деле там 8 из них). Сразу после создания я должен создать процесс, который будет использовать эти файлы.
script выглядит следующим образом:
# This is more complex function, but it basically does this:
def use_file():
subprocess.call(['C:\\use_file', 'C:\\foo.txt']);
f = open( 'C:\\foo.txt', 'wb')
for i in 10000:
f.write( one_MB_chunk)
f.flush()
os.fsync( f.fileno())
f.close()
time.sleep(5) # With this line added it just works fine
t = threading.Thread( target=use_file)
t.start()
Но приложение use_file
действует как foo.txt
пусто. Происходят какие-то странные вещи:
- если я выполнил
C:\use_file C:\foo.txt
в консоли (после завершения script), я получаю правильные результаты - если я выполняю вручную
use_file()
в другой консоли python, я получаю правильные результаты -
C:\foo.txt
отображается на диске сразу после вызоваopen()
, но остается размер0B
до конца script - Если я добавлю
time.sleep(5)
, он просто начнет работать как ожидалось (или, скорее, требуется)
Я уже нашел:
-
os.fsync()
, но он не работает (результат изuse_file
выглядит так, как будтоC:\foo.txt
был пустым) - Использование
buffering=(1<<20)
(при открытии файла) не работает либо
Мне все больше и больше нравится это поведение.
Вопросы:
- Работает ли python fork
close()
на фоне? Где это документировано? - Как это сделать?
- Я что-то пропустил?
- После добавления
sleep
: это ошибка windows/python?
Примечания: (для случая, когда что-то не так с другой стороны) приложение use_data
использует:
handle = CreateFile("foo.txt", GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
size = GetFileSize(handle, NULL)
И затем обрабатывает size
байты из foo.txt
.