Python 3.4+Асинхронное программированиепонятие
asyncio.SubprocessTransport
протоколы и транспорты
Транспорт дочернего процесса: get_pid(), get_returncode(), get_pipe_transport(fd), terminate() и kill(). Его возвращает loop.subprocess_exec().
Синтаксис
transport, protocol = await loop.subprocess_exec(Proto, program, *args)
Учащемуся этот уровень обычно не нужен: для TCP есть потоки asyncio.open_connection() и asyncio.start_server(), для процессов — asyncio.create_subprocess_exec(). Объект Process из create_subprocess_exec() — обёртка как раз над этим транспортом, и у него есть pid, returncode, wait() и communicate(). get_returncode() возвращает None, пока процесс жив, — это не «код 0». Транспорт нужно закрыть close(), иначе при сборке мусора будет ResourceWarning.
Примеры
import asyncio
import sys
class Waiter(asyncio.SubprocessProtocol):
def __init__(self, done):
self.done = done
def process_exited(self):
self.done.set_result(True)
async def main():
loop = asyncio.get_running_loop()
done = loop.create_future()
transport, _ = await loop.subprocess_exec(
lambda: Waiter(done), sys.executable, '-c', 'raise SystemExit(3)',
stdin=None, stdout=None, stderr=None)
print(isinstance(transport.get_pid(), int)) # → True
await done
print(transport.get_returncode()) # → 3
transport.close()
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности