Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 Как добавлять асинхронные задачи по мере их необходимости?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 952
Насколько я понял, можно поступить двумя способами:
1. Последовательно запустить две асинхронные задачи (сначала ПОЛНОСТЬЮ выполнится первая задача и только потом вторая):
+
import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime('%X')}")

    await say_after(1, 'hello')
    await say_after(2, 'world')

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())


2. Запустить несколько задач параллельно:
+
import asyncio

async def factorial(name, number):
    f = 1
    for i in range(2, number + 1):
        print(f"Task {name}: Compute factorial({i})...")
        await asyncio.sleep(1)
        f *= i
    print(f"Task {name}: factorial({number}) = {f}")

async def main():
    # Schedule three calls *concurrently*:
    await asyncio.gather(
        factorial("A", 2),
        factorial("B", 3),
        factorial("C", 4),
    )

asyncio.run(main())

# Expected output:
#
#     Task A: Compute factorial(2)...
#     Task B: Compute factorial(2)...
#     Task C: Compute factorial(2)...
#     Task A: factorial(2) = 2
#     Task B: Compute factorial(3)...
#     Task C: Compute factorial(3)...
#     Task B: factorial(3) = 6
#     Task C: Compute factorial(4)...
#     Task C: factorial(4) = 24


А можно как- то по мере выполнения нескольких задач понять, что они не полностью загружают систему и добавить еще нагрузки? Т.е. чтобы получилось динамически менять нагрузку на систему.
7 янв 19, 11:11    [21779340]     Ответить | Цитировать Сообщить модератору
 Re: Как добавлять асинхронные задачи по мере их необходимости?  [new]
vkle
Member

Откуда: Самара
Сообщений: 14628
AlekseySQL
они не полностью загружают систему
Как Вы предполагаете оценивать полноту загрузки - по системному Load Average или по заранее заданному предельно допустимому суммарному уровню загрузки с учетом некоторого коэффициента от каждого вида задачи? Первый способ довольно медленный и инерционный, во втором весьма сложно, а то и невозможно учесть другие процессы.
7 янв 19, 11:45    [21779348]     Ответить | Цитировать Сообщить модератору
 Re: Как добавлять асинхронные задачи по мере их необходимости?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 952
vkle
AlekseySQL
они не полностью загружают систему
Как Вы предполагаете оценивать полноту загрузки - по системному Load Average или по заранее заданному предельно допустимому суммарному уровню загрузки с учетом некоторого коэффициента от каждого вида задачи? Первый способ довольно медленный и инерционный, во втором весьма сложно, а то и невозможно учесть другие процессы.


Я делаю запросы к интернет- серверу через определенные промежутки в установленных лимитов на количество запросов. Тогда я запущу еще потоки, которые будут делать параллельно запросы так, чтобы их общее количество не превышало лимиты сервера. Это очень похоже на менеджеры загрузки, которые запускают сразу несколько потоков.
7 янв 19, 12:28    [21779357]     Ответить | Цитировать Сообщить модератору
 Re: Как добавлять асинхронные задачи по мере их необходимости?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 952
UPDATE:
Я делаю запросы к интернет- серверу через определенные промежутки времени, таким образом чтобы оставаться в рамках установленных лимитов на количество запросов.
7 янв 19, 12:33    [21779360]     Ответить | Цитировать Сообщить модератору
 Re: Как добавлять асинхронные задачи по мере их необходимости?  [new]
vkle
Member

Откуда: Самара
Сообщений: 14628
AlekseySQL
в рамках установленных лимитов на количество запросов
Вот это вполне понятно. Где-то есть число, которое показывает максимальное количество запросов в единицу времени. Или число, указывающее количество запросов до истечения учетного периода.
Как вариант, это значение можно определить или вычислить, анализируя ответы сервера, например, контролируя в ответе сообщение об ошибке превышения лимитов.

AlekseySQL
лимиты сервера
А вот это, как раз, и не понятно. Можете пояснить, что это такое и откуда его взять можно?
7 янв 19, 16:52    [21779492]     Ответить | Цитировать Сообщить модератору
 Re: Как добавлять асинхронные задачи по мере их необходимости?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 952
vkle
AlekseySQL
в рамках установленных лимитов на количество запросов
Вот это вполне понятно. Где-то есть число, которое показывает максимальное количество запросов в единицу времени. Или число, указывающее количество запросов до истечения учетного периода.
Как вариант, это значение можно определить или вычислить, анализируя ответы сервера, например, контролируя в ответе сообщение об ошибке превышения лимитов.

AlekseySQL
лимиты сервера
А вот это, как раз, и не понятно. Можете пояснить, что это такое и откуда его взять можно?


Да что вы в эти ЛИМИТЫ уперлись? Я их ЗНАЮ!
Мне надо уметь добавлять/удалять асинхронную задачу "на лету" с помощью asyncio. Не заранее сформировать массив с определенным количеством задач, а добавлять / удалять в процессе работы программы (анализируя скорость ответов сервера).
9 янв 19, 09:01    [21780263]     Ответить | Цитировать Сообщить модератору
 Re: Как добавлять асинхронные задачи по мере их необходимости?  [new]
vkle
Member

Откуда: Самара
Сообщений: 14628
AlekseySQL
Да что вы в эти ЛИМИТЫ уперлись? Я их ЗНАЮ!
Вообще то, Вы в самом первом посте задали вопрос именно про полноту загрузки системы:
AlekseySQL
А можно как- то по мере выполнения нескольких задач понять, что они не полностью загружают систему и добавить еще нагрузки?
9 янв 19, 10:04    [21780292]     Ответить | Цитировать Сообщить модератору
 Re: Как добавлять асинхронные задачи по мере их необходимости?  [new]
AlekseySQL
Member

Откуда:
Сообщений: 952
Напишу ответ для будущих поколений. Метод
task = asyncio.create_task(speaker("extra work"))


не только создает задачу, но и запускает ее в текущем event loop-е. Так что достаточно просто создать новую задачу, чтобы повысить нагрузку на систему. По мере ее завершения нагрузка уменьшится.
11 янв 19, 06:01    [21782369]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить