Python бесконечный цикл, блокирующий асинхронные параллельные задачи - PullRequest
1 голос
/ 28 апреля 2019

возможно, я понял что-то не так, но вот моя проблема.

Как я прочитал в документальном фильме, вам нужно создавать задачи для их одновременного выполнения:

async def main():
x=1
lastman = deque([])
    while True:
        task1 = asyncio.create_task(get_salt())
        task2 = asyncio.create_taks(get_sugar_every10_secondes())

        await task1
        await task2

async def get_salt():
    salt = await salt.fetch()
    print(salt)

async def get_sugar_every10_secondes():
    await asyncio.sleep(10)
    sugar = await sugar.fetch()
    print(sugar)

 asyncio.get_even_loop().run_until_completed(main())

Проблемав том, что я получаю соль и сахар только каждые 10 секунд, но я хочу, чтобы соль как можно быстрее и сахар каждые 10 секунд.(Py3.7)

1 Ответ

0 голосов
/ 29 апреля 2019
while True:
    # ...
    await task1
    await task2

Эта часть означает:

  1. ждут, когда задача1 будет выполнена
  2. затем ждите, когда задача 2 будет выполнена
  3. затем продолжить цикл

Ни одна из задач не будет воссоздана, пока обе не будут выполнены.

Вместо этого вы должны создать две задачи, каждая из которых вызывает собственную сопрограмму в цикле while True. Таким образом, ни один из них не должен ждать, пока другое будет сделано.

Примерно так:

import asyncio
from collections import deque


async def do_constantly(coro_func):
    while True:
        await coro_func()


async def get_salt():
    await asyncio.sleep(1)
    print('salt')


async def get_sugar_every10_secondes():
    await asyncio.sleep(10)
    print('sugar')


async def main():
    task1 = asyncio.create_task(do_constantly(get_salt))
    task2 = asyncio.create_task(do_constantly(get_sugar_every10_secondes))


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.run_forever()  # to keep tasks spawning
...