Дорогой дневник, сегодня я 2 часа дебагала асинхронный код, только чтобы узнать, что метод Process.wait, задокументированный как
Wait for the child process to terminate.
...внезапно не делает действие "wait for the child process to terminate", а делает полный мусор, который был нужен -1 человеку за всё время существования asyncio — ждёт, пока закроются все потоки I/O, что с завершением процесса имеет ровно ничего общего.
А сделать действие, которое под "wait for the child process to terminate" понимают не рептилоиды, а человеки, т.е. wait(2), в asyncio нельзя никак.
import asyncio
async def main():
process = await asyncio.create_subprocess_exec("yes", stdout=asyncio.subprocess.PIPE)
await asyncio.sleep(1)
process.kill()
await process.wait() # hangs
asyncio.run(main())
Wait for the child process to terminate.
...внезапно не делает действие "wait for the child process to terminate", а делает полный мусор, который был нужен -1 человеку за всё время существования asyncio — ждёт, пока закроются все потоки I/O, что с завершением процесса имеет ровно ничего общего.
А сделать действие, которое под "wait for the child process to terminate" понимают не рептилоиды, а человеки, т.е. wait(2), в asyncio нельзя никак.
import asyncio
async def main():
process = await asyncio.create_subprocess_exec("yes", stdout=asyncio.subprocess.PIPE)
await asyncio.sleep(1)
process.kill()
await process.wait() # hangs
asyncio.run(main())