если я использую asyncio для запуска подпроцесса, который запускает другой скрипт python, в конце появляется предупреждение: RuntimeWarning: A loop is being detached from a child watcher with pending handlers
, если подпроцесс завершается с помощью terminate ().
Например, очень простой dummy:
import datetime
import time
import os
if __name__ == '__main__':
for i in range(3):
msg = 'pid({}) {}: continue'.format(os.getpid(), datetime.datetime.now())
print(msg)
time.sleep(1.0)
Затем я создаю dummy:
import asyncio
from asyncio import subprocess
T = 3 # if the T=5, which allows the thread to finish, then there is no such warning.
async def handle_proc():
p = None
try:
p = await subprocess.create_subprocess_exec(
'python3', 'dummy.py',
#'dummy.sh'
)
await asyncio.sleep(T)
finally:
if p and p.returncode is None:
p.terminate()
print('handle_proc Done!')
if __name__ == '__main__':
asyncio.run(handle_proc())
Будет предупреждение, если T достаточно короткий, чтобы вызвать вызов p.terminate ().
если я запускаю сценарий bash, предупреждения нет:
#!/usr/bin/env bash
set -e
N=10
T=1
for i in $(seq 1 $N)
do
echo "loop=$i/$N, sleep $T"
>&2 echo "msg in stderror: ($i/$N,$T)"
sleep $T
done
Что я тут не так сделал?