как избавиться от предупреждения `RuntimeWarning: l oop отсоединяется от дочернего наблюдателя с ожидающими обработчиками` - PullRequest
0 голосов
/ 12 апреля 2020

если я использую 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

Что я тут не так сделал?

...