Ответы пользователя по тегу Асинхронное программирование
  • Как получить результат выполнения задачи в Asyncio?

    MAKAPOH
    @MAKAPOH
    многостаночник
    Можно в каждую функцию передать объект очереди через которую они вернут свой результат.
    Ответ написан
    Комментировать
  • Какие вы знаете способы выполнения тяжелых задач на node.js?

    MAKAPOH
    @MAKAPOH
    многостаночник
    В дополнении к перечисленому, в nodejs недавно появилась эксперементальная возможность запускать код в отдельных потоках, называется Worker Threads.
    Ответ написан
    1 комментарий
  • Как решить подобную задачу используя async/await/asyncio?

    MAKAPOH
    @MAKAPOH
    многостаночник
    В первом приближении на asyncio ваши боты будут представлять из себя корутины а очереди надо заменить на таковые из пакета asyncio. Но одним asyncio вы не обойдётесь так как он слишком низкоуровневый, вам же придётся выполнять какие то http запросы, возможно слушать запросы от vk api и т.п. Реализовывать это самому на asyncio безсмысленно, лучше взять готовые реализации вроде aiohttp как вам уже советовали. Возможно что бы разобратся вам поможет вот такой синтетический пример на голом asyncio, тут несколько корутин получают собщения из своих очередей и просто печатают их на экран:
    код
    import asyncio
    import random
    
    
    class Bot:
        def __init__(self, bot_name, queue):
            self._name = bot_name
            self._queue = queue
    
        async def start(self):
            try:
                while True:
                    data = await self._queue.get()
                    print('{}: {}'.format(self._name, data))
            except asyncio.CancelledError:
                print("{}: stoped".format(self._name))
    
    
    async def message_generator(bots):
        i = 0
        while True:
            for bot in bots:
                i += 1
                await bot["queue"].put("msg {}".format(i))
                await asyncio.sleep(((random.random()/2.0)+0.1))
    
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        bots = []
        n = 4
        for i in range(n):
            q = asyncio.Queue()
            t = loop.create_task(Bot("bot{}".format(i), q).start())
            bot = {
                "queue": q,
                "task": t
            }
            bots.append(bot)
        try:
            loop.run_until_complete(message_generator(bots))
        except KeyboardInterrupt:
            for bot in bots:
                bot["task"].cancel()
                loop.run_until_complete(bot["task"])
            loop.stop()


    Ваши боты технически будут работать так же но вместо вывода в терминал выполнять какую то свою логику.
    Ответ написан
  • Asyncio. Как добавить задачу в запущенный loop?

    MAKAPOH
    @MAKAPOH
    многостаночник
    Если я правильно всё понял то вам должно хватить:

    Идея следующая. Пишем корутину-исполнитель которая из очереди задач на скачивание берёт очередное задание, загружает что требуется, а результат кладёт в другую очередь результатов. С помощью вызова loop.create_task создаём несколько паралельно работающих корутин-исполнителей передав им как параметр очередь с задачами и очередь результатов. Пишем корутину-генератор задач, которая в соответствии с вашим алгоритмом будет наполнять очередь задачами. Как то так, к сожалению сейчас нет времени писать код.
    По теме есть вот такой доклад - Patterns for asyncio applications там описаны несколько вариантов запуска циклов, в том числе в отдельном потоке как вам надо. Дерзайте :)
    Ответ написан
    1 комментарий