prompt-toolkit завершает программу при простое - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь написать простое приложение командной строки с prompt-toolkit. Это работает довольно хорошо, однако я хочу выйти из программы, если не было ввода в течение длительного времени. Это оказалось очень сложным для меня.

Вот некоторый псевдокод для того, как должно работать приложение cli:

from prompt_toolkit import PromptSession
import time

def execute(cmd):
    # do long task
    time.sleep(120)

if __name__ == '__main__':
    s = PromptSession()

    while True:
        start_time = time.time()
        cmd = s.prompt('>')
        execute(cmd)

        if time.time() - start_time > 60:
            break

Так что программа должна завершиться, если пользователь не сделал этого. не выдает команду за последние 60 секунд. Но если команда выполняется дольше 60 секунд, она должна быть прервана только через 60 секунд после ее завершения (и новая команда не была выполнена).

Я уже спотыкаюсь о первом бите. Нужна ли параллельная обработка для проверки времени при работе s.prompt? Существует также prompt_async версия команды. Я играл с этим, но безуспешно ...

1 Ответ

0 голосов
/ 02 мая 2020

Итак, я нашел очень простой ответ на мой вопрос в документации asyncio, который делает именно то, что я искал: asyncio.wait_for. Решение здесь, только для записи:

from prompt_toolkit import PromptSession
import asyncio

def execute(cmd):
    # do long task
    time.sleep(120)

if __name__ == '__main__':
    s = PromptSession()

    while True:
        try:
            cmd = await asyncio.wait_for(s.prompt_async('>'), timeout=60)
        except asyncio.TimeoutError:
            break
        execute(cmd)
...