Почему Python запускает много процессов при использовании потоковой передачи - PullRequest
1 голос
/ 26 мая 2020

Я написал программу Python, в которой используются классы threading.Thread. Запускается около 25 потоков. Он работает на Raspberry Pi 4 (4 ядра).

Я думал, что при использовании потоков будет запущен только процесс 1 Python (из-за GIL). Похоже, запущено 35 процессов.

top показывает, что python3 использует 140% ЦП. (отображается только 1 процесс)

htop показывает много python3 процессов. Они также составляют около 140%.

pstree -p показывает следующее (только часть python):

       ├─python3(28401)─┬─{python3}(28402)
       │                ├─{python3}(28403)
       │                ├─{python3}(28404)
       │                ├─{python3}(28405)
       │                ├─{python3}(28406)
       │                ├─{python3}(28407)
       │                ├─{python3}(28408)
       │                ├─{python3}(28409)
       │                ├─{python3}(28410)
       │                ├─{python3}(28412)
       │                ├─{python3}(28413)
       │                ├─{python3}(28414)
       │                ├─{python3}(28415)
       │                ├─{python3}(28416)
       │                ├─{python3}(28417)
       │                ├─{python3}(28418)
       │                ├─{python3}(28419)
       │                ├─{python3}(28421)
       │                ├─{python3}(28422)
       │                ├─{python3}(28423)
       │                ├─{python3}(28424)
       │                ├─{python3}(28425)
       │                ├─{python3}(28426)
       │                ├─{python3}(28427)
       │                ├─{python3}(28428)
       │                ├─{python3}(28429)
       │                ├─{python3}(28430)
       │                ├─{python3}(28432)
       │                ├─{python3}(28433)
       │                ├─{python3}(28434)
       │                ├─{python3}(28435)
       │                ├─{python3}(28437)
       │                ├─{python3}(28438)
       │                ├─{python3}(28444)
       │                └─{python3}(28445)

Мой вопрос, как это объяснить? Действительно ли много процессов выполняется параллельно, что означает, что можно будет использовать до 300-400% ЦП? Или это какие-то артефакты, связанные с вводом-выводом?

1 Ответ

1 голос
/ 26 мая 2020

Потоки в Linux выглядят как процессы для некоторых инструментов. Это из-за того, как потоки эволюционировали из процессов с течением времени. В основном они создавали «потоки», давая процессам возможность совместно использовать одно и то же виртуальное адресное пространство, те же дескрипторы файлов и т. Д. c. В некотором смысле разные «потоки» внутри одного и того же «процесса» на самом деле являются отдельными процессами с различными идентификаторами процессов.

Попробуйте pstree --hide-threads, если вы не хотите видеть потоки.

...