Если criteria
- тип класса, я сомневаюсь, что он будет оптимизирован, потому что другой поток всегда может изменить это значение в то же время. Для struct
s я не уверен, но мое чувство кишки состоит в том, что он не будет оптимизирован, но я думаю, что это не повлияет на производительность в этом случае.
Это потому, что content
еще не был записан на диск, когда вы выполняете копирование. Это происходит потому, что записи буферизуются и не всегда происходят сразу после вашего звонка file.write
. Чтобы убедиться, что содержимое записано на диск в данный момент, вы можете использовать file.flush
.
В вашем случае достаточно изменить код на:
def write_file(file_destination: str, content: bytes):
with tempfile.NamedTemporaryFile() as fp:
fp.write(content)
fp.flush()
shutil.copy(fp.name, file_destination)
. Для получения дополнительной информации о том, когда содержимое фактически записывается на диск, вы можете увидеть документацию io.BufferedWriter
[ 116]. Соответствующая часть:
Буфер будет записан в базовый объект RawIOBase при различных условиях, включая:
blockquote>
- , когда буфер становится слишком маленьким для всех ожидающих данных ;
- при вызове flush ();
- при запросе seek () (для объектов BufferedRandom);
- при закрытии или уничтожении объекта BufferedWriter.
]Следовательно, в вашем первом примере возможно, что он работает только иногда, потому что в те моменты контент, который вы пишете, превышает буфер и поэтому должен быть немедленно записан.
Ваш второй пример, напротив, работает, потому что, когда вы выходите из блока
with
, файл закрывается, и, следовательно, буфер должен быть очищен и записан на диск.