Стоит ли распараллеливать код?
Есть приложение, по сути, состоящая из двух частей:
- Telegram-бот, через который можно добавлять/удалять/изменять аккаунты, прокси, запускать/останавливать вторую часть программы.
- Скрипт, который сначала из бд получает список аккаунтов, прокси, потом с помощью Telethon эти аккаунты общаются с одним ботом.
Обе части асинхронны. Я не знаю, как правильно решить некоторые проблемы:
- Как запускать/останавливать скрипт (2-ую часть) через Telegram-бота? (Т.е. я нажимаю на кнопку, скрипт запускается, нажимаю еще раз, останавливается)
- Как можно из скрипта (образно, я не знаю, как правильно это назвать) получать данные. Когда аккаунты общаются с ботом, они получают некоторую информацию (конкретно - аккаунты пишут команду, бот возвращает число. нужно, чтобы аккаунты написал боту эту команду, получили определённое число, потом все эти числа нужно сложить и вывести её через telegram-бота)
Вот схема, как это должно работать
Пути решения:
- 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. Нормально ли делать бесконечный цикл?