Since nobody was able to replicate the problem, I went hunting around our office for machines. It passed on everything except my machine. I tested on a Mac with the same software versions I was using. I even went hunting for a Desktop G5 with the EXACT same hardware and software config I had -- same result. Both tests (with tempfile and without tempfile) succeeded on everything.
For kicks, I downloaded Python 2.6.4, and tried it on my desktop, and same pattern on my system as Python 2.5.1: tempfile failed, and notempfile succeeded.
This is leading me to the conclusion that something's hosed on my Mac, so this isn't likely to be a problem that anyone else runs into ever.
Thanks VERY much to everyone (especially Alex Martelli) who helped on this!
I think your answer can be found here. You have to explicitly os.close()
the file descriptor given as the first part of the tuple that mkstemp
gives you.
Edit: no, the OP is already doing what is supposed to be done. I'm leaving the answer up for the nice link.
Как вы думаете, почему ошибка не подлинная? Вы запускаете 10000 потоков, каждый из которых открывает файл, в то время как максимальное количество открытых файлов обычно составляет 1024 в системах Unix.
Сначала попробуйте вручную отслеживать количество файлов, открытых в данный момент, и проверьте, не превышает ли оно предельное значение ОС .
Я не могу воспроизвести проблему с (собственной сборкой Apple) Python 2.5.1 в Mac OS X 10.5.9 - отлично работает до завершения!
Я пробовал как на Macbook Pro, то есть на процессоре Intel, так и на старом PowerMac, то есть на процессоре PPC.
Так что я могу только представить, что в 10.5.8 должна была быть ошибка, которую я никогда не замечал (нет любой 10.5.8 для тестирования, так как я всегда обновляюсь сразу же, когда это предлагает обновление программного обеспечения). Все, что я могу предложить, это попробовать обновиться до 10.5.9 и посмотреть, исчезнет ли ошибка - если нет, я понятия не имею, как такое различие в поведении между моими машинами и вашим возможно.
Я только что протестировал ваш код на своем компьютере с Ubuntu Linux здесь, и у меня это сработало отлично.
У меня есть одно предложение, которое вы можете попробовать. Не знаю, поможет, но не повредит. Перепишите свой код для использования с:
from __future__ import with_statement
def worker_tempfile():
tempfd, tempfn = tempfile.mkstemp()
with os.fdopen(tempfd, 'wb') as tempobj:
tempobj.write('hello, world')
os.remove(tempfn)
time.sleep(10)
Предполагается, что оператор with
гарантирует, что объект файла будет закрыт, несмотря ни на что. Может, это поможет?
Удачи. Между прочим, отличная работа над вопросом.