Почему сервер блокирует запуск нескольких ботов, команда срабатывает только 1 раз?

Добрый день, у меня есть главный телеграмм бот который запускает других телеграмм ботов по нажатию на кнопку в multiprocessing в новом процессе отдельном.

ПО нажатию на кнопку в главном боте второй бот запускает, а если нажать еще на вторую кнопку то второй multiprocessing тормозится и больше ничего не запускается.

Перезапуск программы тоже не помогает.

Но после перезагрузки сервера запуск второго бота через multiprocessing срабатывает еще 1 раз и снова в блок.
import multiprocessing as mp

def st():

    executor.start_polling(dispatcher=dp)

# custom coroutine
def start_bot():

    p = mp.Process(target=st)
    p.start()


В логах не вижу ничего, на Windows всё отлично работает.

Код главного бот
Старт пользовательского бота происходит в функции choosing_bot:

import asyncio
from aiogram import Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram import executor
from aiogram import types
from bot.add_application import add_application
import os
import logging
import nest_asyncio
nest_asyncio.apply()


logging.basicConfig(level=logging.DEBUG, filename='bot.log',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

TOKEND = ''
bot1 = Bot(token=TOKEND)
storage = MemoryStorage()
d = Dispatcher(bot1, storage=storage)

add_application.register_handler_app(d)


@d.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    keyboard = types.InlineKeyboardMarkup()
    button1 = types.InlineKeyboardButton(text="Добавить приложение", callback_data="add")
    button2 = types.InlineKeyboardButton(text="Удалить приложение", callback_data="delet")
    button3 = types.InlineKeyboardButton(text="Сменить канал", callback_data="changec_hannel")
    button4 = types.InlineKeyboardButton(text="Сменить бота", callback_data="change_bot")
    button5 = types.InlineKeyboardButton(text="Запустить бота", callback_data="run")
    button6 = types.InlineKeyboardButton(text="Авторизоваться VK",
                                         url="https://oauth.vk.com/authorize?client_id=51711276&display=page&redirect_uri=https://t.me/distribution_postsBot&scope=wall,video,offline&response_type=token&v=5.52")

    keyboard.add(button1, button2)
    keyboard.add(button3, button4)
    keyboard.add(button5)
    keyboard.add(button6)
    await message.answer("Меню", reply_markup=keyboard)


@d.callback_query_handler(text='run')
async def start_posts(callback: types.CallbackQuery):
    import sqlite3
    conn = sqlite3.connect('bot_users.sql')
    cur = conn.cursor()
    cur.execute(
        'CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, IDUSER int , TOKEN varchar(46), NAMEBOT varchar(150), IDBOT varchar(50), IDCHANNEL varchar(50), NAMECHANNEL varchar(150), TITLECHANNEL varchar(150), STATUS varchar(10), DOMEN varchar(150))')
    conn.commit()
    cur.execute(f"SELECT * FROM users WHERE IDUSER = {callback.message.chat.id}")
    data = cur.fetchall()
    name_bot = {}
    for bot in data:
        name_bot[bot[3]] = bot[6]

    keyboard = types.InlineKeyboardMarkup()

    for key in name_bot:
        b = types.InlineKeyboardButton(text=f' {key} | Канал: {name_bot[key]}', callback_data=key)
        keyboard.add(b)

    await callback.message.answer("Выберите бота для запуска", reply_markup=keyboard)
    await callback.answer(cache_time=1)
    cur.close()
    conn.close()


# @dp.message_handler(content_types="any")
# async def choosing_bot(message: types.Message):
#     await message.answer(message.forward_from_chat.id)


@d.callback_query_handler()
async def choosing_bot(callback: types.CallbackQuery):
    import sqlite3
    conn = sqlite3.connect('bot_users.sql')
    cur = conn.cursor()
    cur.execute(
        'CREATE TABLE IF NOT EXISTS users (id int auto_increment primary key, IDUSER int , TOKEN varchar(46), NAMEBOT varchar(150), IDBOT varchar(50), IDCHANNEL varchar(50), NAMECHANNEL varchar(150), TITLECHANNEL varchar(150), STATUS varchar(10), DOMEN varchar(150))')
    conn.commit()
    cur.execute(f"SELECT * FROM users WHERE IDUSER = {callback.message.chat.id}")
    data = cur.fetchall()
    name_bot = {}
    TOKEN = ""
    if not os.path.exists("token_bot.txt"):
        with open(r"token_bot.txt", "w") as file:
            print("Файла с токеном бота не существует, создаём файл!")

    for bot in data:
        name_bot[bot[3]] = bot[2]
    for key in name_bot:
        if key in callback.data:
            TOKEN = name_bot[key]

    with open(f"token_bot.txt", "r+") as file:
        file.write(str(TOKEN) + "\n")
    from bot.start import start_bot
    loop = asyncio.get_event_loop()
    loop.run_in_executor(None, start_bot)

    await callback.message.answer(f"Запускаем {callback.data}")
    await callback.answer(cache_time=1)
    print("GOOD")
    cur.close()
    conn.close()


if __name__ == '__main__':

    executor.start_polling(d, skip_updates=True)
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы