Стоит ли распараллеливать код?

Есть приложение, по сути, состоящая из двух частей:

  1. Telegram-бот, через который можно добавлять/удалять/изменять аккаунты, прокси, запускать/останавливать вторую часть программы.
  2. Скрипт, который сначала из бд получает список аккаунтов, прокси, потом с помощью Telethon эти аккаунты общаются с одним ботом.

Обе части асинхронны. Я не знаю, как правильно решить некоторые проблемы:

  1. Как запускать/останавливать скрипт (2-ую часть) через Telegram-бота? (Т.е. я нажимаю на кнопку, скрипт запускается, нажимаю еще раз, останавливается)
  2. Как можно из скрипта (образно, я не знаю, как правильно это назвать) получать данные. Когда аккаунты общаются с ботом, они получают некоторую информацию (конкретно - аккаунты пишут команду, бот возвращает число. нужно, чтобы аккаунты написал боту эту команду, получили определённое число, потом все эти числа нужно сложить и вывести её через telegram-бота)

Вот схема, как это должно работать cхема Пути решения:

  1. asyncio.Queue. Добавляю корутину dp.loop.create_task(second_part(queue))
class Codes(enum.IntEnum):
    Start = 0
    Stop = 1
    GetBalance = 2

async def second_part(queue):
    accounts = []
    while 1:
        message = queue.get()
        if message.code == Codes.Start:
            accounts = [init_account(...) for session in Session.select()]
            await asyncio.gather(*[acc.send_message('/start') for acc in accounts])
        elif message.code == Codes.Stop:
            await asyncio.gather(*[acc.disconnect() for acc in accounts])
            accounts = []
        elif message.code == Codes.GetBalance:
            # how to do it? 
        else:
            ...
            

Но как в этом случае получать баланс (т.е. какое-то число)? Создать еще одну очередь, пробросить её в класс бота, собственно ложить число. Ещё были варианты с threading и multiprocessing, но суть не меняется. Стоит ли выбирать threading/multiprocessing вместо asyncio? Ведь задача по сути io bound. Нормально ли делать бесконечный цикл?


Ответы (0 шт):