Может ли модуль sched python запускать асинхронные задачи без блокировки во время выполнения задачи? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть класс Module с методом invoke(), который может выполнять некоторые операции ввода-вывода / wait.

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

Может ли модуль sched создавать различные задачи и работать с ними неблокирующим образом, а если нет, то какой модуль может выполнять работу для нескольких повторяющихся одновременных задач ?

Я посмотрел на sched, но не смог найти однозначного ответа. Я также посмотрел на asyncio, что подтолкнуло меня к двум ответам, которые, кажется, не соответствуют моим потребностям, соответственно while True (что кажется громоздким) и Задачи (которые не появляются чтобы разрешить одновременный запуск нескольких методов) .

1 Ответ

0 голосов
/ 09 июля 2019

Изучите приведенный ниже код, глава 18 из «Свободного питона» Лучано Рамальо, отличный ресурс по модулю asyncio. Кроме того, никогда не забывайте сами документы на https://docs.python.org/3/library/asyncio.html

#!/usr/bin/env python3

# spinner_asyncio.py

# credits: Example by Luciano Ramalho inspired by
# Michele Simionato's multiprocessing example in the python-list:
# https://mail.python.org/pipermail/python-list/2009-February/538048.html

import asyncio
import itertools
import sys


@asyncio.coroutine  # <1>
def spin(msg):  
    write, flush = sys.stdout.write, sys.stdout.flush
    for char in itertools.cycle('|/-\\'):
        status = char + ' ' + msg
        write(status)
        flush()
        write('\x08' * len(status))
        try:
            yield from asyncio.sleep(.1)  # <3>
        except asyncio.CancelledError:  # <4>
            break
    write(' ' * len(status) + '\x08' * len(status))


@asyncio.coroutine
def slow_function():  # <5>
    # pretend waiting a long time for I/O, Non-blocking call!
    yield from asyncio.sleep(3)  # <6>
    return 42


@asyncio.coroutine
def supervisor():  # <7>
    spinner = asyncio.async(spin('thinking!'))  # <8>
    print('spinner object:', spinner)  # <9>
    result = yield from slow_function()  # <10>
    spinner.cancel()  # <11>
    return result


def main():
    loop = asyncio.get_event_loop()  # <12>
    result = loop.run_until_complete(supervisor())  # <13>
    loop.close()
    print('Answer:', result)


if __name__ == '__main__':
    main()

1: сопрограммы, предназначенные для использования с asyncio, должны быть украшены @asyn cio.coroutine. Это не обязательно, но настоятельно рекомендуется.

3: Использовать выход из asyncio.sleep (.1) вместо просто time.sleep (.1) для сна без блокировки цикла событий.

4: Если asyncio.CancelledError вызывается после пробуждения вращения, это происходит потому, что запрос отменен, поэтому выйдите из цикла.

5: slow_function является сопрограммой и использует yield from для запуска цикла событий продолжайте, пока эта сопрограмма делает вид, что делает ввод / вывод, спя.

6: Выход из выражения asyncio.sleep (3) обрабатывает поток управления в основной цикл, который возобновит эту сопрограмму после задержки сна.

7: супервизор также является сопрограммой, поэтому он может управлять медленной функцией с выходом с.

8: asyncio.async (…) планирует запуск спин-сопрограммы, заключая ее в задачу объект, который возвращается немедленно

9: Показать объект задачи. Вывод выглядит как Задача в ожидании coro = spin () работает на spinner_asyncio.py:12.

10: включите функцию slow_function (). Когда это будет сделано, получите возвращаемое значение. Между тем цикл обработки событий продолжится, потому что slow_function в конечном итоге использует yield из asyncio.sleep (3), чтобы передать управление обратно основному цикл. * * 1 021

11: объект задачи можно отменить; это вызывает asyncio.CancelledError на выходе линия, где сопрограмма в настоящее время приостановлена. Сопрограмма может поймать исключение и задержка или даже отказ от отмены.

12: получить ссылку на цикл обработки событий.

13: довести сопрограмму супервизора до завершения; возвращаемое значение сопрограммы Возвращаемое значение этого вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...