Я создаю большой файл с моим 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.