Отсутствует вывод, когда stderr указывает на файл в многопоточном скрипте Python без стека

Рассмотрим следующие четыре строки (все одинаковые), которые выдают одинаковое количество строк из файла журнала:

$ zcat test-catalog.xml.gz | bin/process-catalog.py -b build -T 4 - 2>&1 | wc -l
620
$ zcat test-catalog.xml.gz | bin/process-catalog.py -b build -T 4 - 2>&1 | wc -l
620
$ zcat test-catalog.xml.gz | bin/process-catalog.py -b build -T 4 - 2>&1 | wc -l
620
$ zcat test-catalog.xml.gz | bin/process-catalog.py -b build -T 4 - 2>&1 | wc -l
620

Теперь рассмотрим точно такие же строки, за исключением того, что вместо подсчета строк из stderr мы считаем строки файла, который был прочитан из stderr:

$ zcat test-catalog.xml.gz | bin/process-catalog.py -b build -T 4 - 2>test.txt ; wc -l test.txt
612 test.txt
$ zcat test-catalog.xml.gz | bin/process-catalog.py -b build -T 4 - 2>test.txt ; wc -l test.txt
617 test.txt 
$ zcat test-catalog.xml.gz | bin/process-catalog.py -b build -T 4 - 2>test.txt ; wc -l test.txt
619 test.txt
$ zcat test-catalog.xml.gz | bin/process-catalog.py -b build -T 4 - 2>test.txt ; wc -l test.txt
617 test.txt

Обратите внимание, что количество строк изменяется при отправке stderr в файл.

Опция -T указывает количество потоков, которые использует скрипт Python без стека, и когда я устанавливаю его в один поток, я получаю согласованные результаты. Таким образом, это похоже на то, что что-то завершается до того, как будет записан последний бит вывода. Тем не менее, я заметил, что скрипт фактически выполняет свою задачу каждый раз (несмотря на то, что он не регистрируется полностью).

Я озадачен, почему вывод журнала будет отличаться в зависимости от того, куда я отправляю stderr. И я также озадачен тем, почему количество потоков также влияет на это, несмотря на то, что скрипт завершает свою задачу (поэтому он не заканчивается преждевременно).

Буду признателен, если кто-нибудь поможет мне разобраться в том, что здесь происходит. Спасибо!

1 ответ

Перешел на вход в файл и теперь он работает. Проблема решена. Все еще немного любопытно, почему.

Другие вопросы по тегам