Будут ли эти команды os.popen работать параллельно? - PullRequest
0 голосов
/ 18 октября 2019

Если я запускаю серию операторов os.popen(...) в цикле с read(), прикрепленными к каждому, будут ли команды выполняться параллельно или вызовы read() приведут к ожиданию кода, пока каждый процесс не получитпрервано, прежде чем продолжить?

for cmd in ['cmd1', 'cmd2', 'cmd3']:
    os.popen(cmd).read()

После прочтения документации я подумал, что команды будут выполняться одновременно, однако я попытался провести эксперимент, запустив серию sleep 1 команд в цикле, подобном этому:

for cmd in ['sleep 1', 'sleep 1', 'sleep 1']:
    os.popen(cmd).read()

и ожидал, что они запустятся одновременно, но вместо этого popen, казалось, ждал, пока каждая команда сна завершится, прежде чем перейти к следующей, так что теперь я не уверен.

Я знаю, чтоos.popen устарел, и вместо него следует использовать модуль subprocess, однако я исследую ошибку в унаследованном скрипте, который использует os.popen, и хочу проверить, может ли происходить параллельное выполнение команд.

1 Ответ

0 голосов
/ 18 октября 2019

ОБНОВЛЕНИЕ

Сбой read() в вашем случае, потому что ['cm1', 'cmd2', 'cmd3'] не являются допустимыми командами. Даже в отладчике, если вы сделаете паузу и попытаетесь выполнить os.popen(cmd).read(), он будет оцениваться вечно. Это была хорошая мысль запустить time.sleep(), но не в цикле for, потому что таким образом вы не получите требуемый результат. Допустимым тестом будет запуск 'sleep' в консоли, и, поскольку TIMEOUT из popen() перенаправляет ввод и дает сбой, мы можем использовать приведенный выше пример:

import os
import time
for cmd in ['ping -n 3 127.0.0.1', 'ping -n 5 127.0.0.1', 'tree']:
    print(time.time())
    print(os.popen(cmd).readline())

В этом случае первыйКоманда будет иметь задержку 10 секунд, и мы видим, что процессы не запускаются одновременно, пока один ожидает завершения другого. Вот результаты и время выполнения каждого процесса:

1571386961.499955

Pinging 127.0.0.1 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 127.0.0.1:
    Packets: Sent = 3, Received = 0, Lost = 3 (100% loss),

1571386975.433736

Pinging 127.0.0.1 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 127.0.0.1:
    Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),

1571386999.4259672

Folder PATH listing
Volume serial number is EAE9-D593
C:.
ΓΔΔΔ.idea
³   ΓΔΔΔdictionaries
³   ΐΔΔΔinspectionProfiles
ΓΔΔΔarch_import_ops
...