Форум сайта python.su
Две минуты - это аномально много. Задержка должна быть в милисекунды.
Глупость какая-то закралась.
Офлайн
У проблемы оказалась смешная, но непонятная причина. Оказалось что пока запущен процесс конвертирования удалить конвертированный ранее файл нельзя. Как только конвертирование заканчивается, файл успешно удаляется. Как привязан старый фал к новому процесу для меня - загадка. Может тот внешний конвертер, который я запускаю всегда имеет одинаковый pid? Как это посмотреть?
def convertFiles(not_uploaded, tempdir='c:\\tempdir'):
""" Convert all files from source and put it to temp dir"""
for filename in not_uploaded:
name = os.path.basename(filename)
line = open(filename,'r').readline().replace('\n',' ')+' \"'+ \
os.path.join(tempdir, name) +'\"'
# convert to temp file
try:
process = subprocess.Popen(line, shell=True, stdout=subprocess.PIPE)
process.wait()
except:
print >> open('logs/flyconvert.log','aw'), 'Cant convert file', line
upload_process = threading.Thread(target=uploadFiles, name="upload_thread", args=[not_uploaded, plugin_instance_list])
upload_process.start() # run uploading process
convertFiles(not_uploaded)
Офлайн
sypper-pitНа самом деле никаких особенных трюков нет. Все очень просто.
По подробнее можешь описать решение ?
FerromanLockHunter
Может тот внешний конвертер, который я запускаю всегда имеет одинаковый pid? Как это посмотреть?
Офлайн
1. Не пойдёт.
2. Не понял сути
Спасибо, попробую.
Офлайн
Popen.pid - The process ID of the child process.
None or else returned from Popen.wait()?
Офлайн
Совместными усилиями, вместе с коллегами, нашёл таки причину проблемы.
Суть в том, что при использовании subprocess хендлеры файлов родительского скрипта наследуются дочерними процессами. Что значит, что если есть 2 потока, в одном из которых открывают файл, а в этот момент в другом запускают какой-либо процесс через subrocess, то этот процесс тоже получает хандлер этого файла. Т.е. пока процесс subrocess будет активен, удалить или переименовать файл в другом процессе не получится, так как для этого нужен эксклюзивный доступ, которого нет, пока хандлер файла принадлежит также subrocess-процессу.
К сожалению этот момент не отображён в документации.
Побороть это можно с помощью опции close_fds. В таком случае нет наследования хандлеров, и всё нормально работает. Беда в том, что для Win-платформы это будет работать только начиная с python 2.6 и только если не перенаправлять stdin, stdout или stderr.
Спасибо всем, кто помогал в поиске решения.
Офлайн