Python Glossary English

Python 3.4+Асинхронное программированиепонятие

asyncio.SubprocessProtocol

протоколы и транспорты

Протокол для дочернего процесса: колбэки pipe_data_received(fd, data) на вывод из stdout/stderr, pipe_connection_lost() и process_exited().

Синтаксис

transport, protocol = await loop.subprocess_exec(ProtocolClass, program, *args)

Учащемуся этот уровень обычно не нужен: для TCP есть потоки asyncio.open_connection() и asyncio.start_server(), для процессов — asyncio.create_subprocess_exec(). Вместо протокола почти всегда удобнее asyncio.create_subprocess_exec() и await proc.communicate(): вывод приходит целиком, без разбора, какой fd что прислал. Ловушка протокола — process_exited() может прийти раньше, чем дочитан последний вывод из канала, поэтому «процесс завершился» не значит «все данные уже получены».

Примеры

import asyncio
import sys
class Out(asyncio.SubprocessProtocol):
    def __init__(self, done):
        self.done = done
        self.data = b''
    def pipe_data_received(self, fd, data):
        self.data += data
    def connection_lost(self, exc):
        self.done.set_result(True)  # все каналы закрыты — вывод получен целиком
async def main():
    loop = asyncio.get_running_loop()
    done = loop.create_future()
    transport, proto = await loop.subprocess_exec(
        lambda: Out(done), sys.executable, '-c', 'print(6 * 7)', stdin=None)
    await done
    print(proto.data.strip(), transport.get_returncode())  # → b'42' 0
    transport.close()
asyncio.run(main())

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности