У меня есть проблема, когда команда Unix выполнен с модулем питона подпроцесса застряла: (Полный код здесь: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/func.py)Python подпроцессов выполнения команды застряло
Команда Unix является простой в месте Сортировать. Путь создается процесс:
env = os.environ.copy() env['LC_ALL'] = 'C' cmd, shell = sort_cmd(filename, sort_buffer_size) subprocess.check_call(cmd, env=env, shell=shell)
где sort_cmd является:
def sort_cmd(filename, sort_buffer_size): return (r"sort -z -t$'\xff' -k 1,1 -T . -S {0} -o {1} {1}" .format(sort_buffer_size, filename), True)
Входной файл (который также выходной файл) команды сортировки пусто. Перед вызовом этой команды файл не был пуст (он печатается).
Вопрос в том, является ли это проблемой python, как файл может быть пустым. (Одна из гипотез - это ошибка python 2.7: http://bugs.python.org/issue19809).
Выдача strace в процессе сортировки показала, что он застрял на futex. К сожалению, я не смог воспроизвести эту проблему, и у меня нет входного файла. Когда процесс сортировки был убит вручную, он вернулся (с ошибкой, конечно).
Я использую Gnu Coreutils 8.10
Использование временного файла не лучшее решение, потому что мы должны быть консервативными в отношении использования диска. Команда sort гарантирует, что все прочитает, а затем начнет запись в файл. Это может быть проблема с сортировкой gnu, но у меня недостаточно доказательств, чтобы исключить ошибки python. Кроме того, учитывая, что сортировка не выдается в параллельном режиме, я не понимаю, какой замок ему нужен. –
@ShayanPooya Возможно, он начинает писать поздно, но, очевидно, файл опустел довольно рано. Все Python - это системная команда. Как уже было сказано, не имеет понятия о доступе к файлу. Так как же это? – glglgl