«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как выполнить неблокирующие подпроцессы в Python?

Как выполнить неблокирующие подпроцессы в Python?

Опубликовано 27 ноября 2024 г.
Просматривать:704

How to Execute Non-Blocking Subprocesses in Python?

Неблокирующий вызов подпроцесса

При выполнении внешних сценариев с использованием subprocess.call поддержание неблокирующего рабочего процесса важно, чтобы избежать остановки основной программы. В этой статье представлено комплексное решение для достижения этой цели.

Подход с использованием subprocess.Popen

Основной метод выполнения неблокирующего подпроцесса — использовать subprocess.Popen вместо subprocess.call. Эта альтернатива не блокирует основную программу, позволяя ей продолжать свою работу, пока подпроцесс выполняется независимо. Вот пример:

subprocess.Popen(["python", "slave.py"]   sys.argv[1:])

Подробный пример

Для полной демонстрации неблокирующих вызовов подпроцессов рассмотрите следующий код:

import subprocess
import time

p = subprocess.Popen(['sleep', '5'])

while p.poll() is None:
    print('Still sleeping')
    time.sleep(1)

print('Not sleeping any longer.  Exited with returncode %d' % p.returncode)

Этот код выполняет команду 'sleep' асинхронно, периодически проверяя ее статус до ее завершения.

Альтернатива Асинхронный подход

Для версий Python 3.5 и выше более современный и эффективный подход предполагает использование asyncio. Это обеспечивает настоящий параллелизм, позволяя одновременно выполнять несколько задач. Вот пример:

import asyncio

async def do_subprocess():
    print('Subprocess sleeping')
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print('Subprocess done sleeping.  Return code = %d' % returncode)

async def sleep_report(number):
    for i in range(number   1):
        print('Slept for %d seconds' % i)
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()

tasks = [
    asyncio.ensure_future(do_subprocess()),
    asyncio.ensure_future(sleep_report(5)),
]

loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

Этот подход гарантирует, что и подпроцесс, и основная программа выполняются одновременно, что обеспечивает максимальную производительность и скорость реагирования.

Заявление о выпуске Эта статья перепечатана по адресу: 1729316657. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3