Ну потому что ты фигню написал.
th_bot = Thread(target=pyrobot(), args=())
th_userbot = Thread(target=aiobot(), args=())
Ты пытаешься запустить в качестве потока
значение, возвращаемое функцией pyrobot(). А так как она уходит в цикл и значения не возвращает, то далее ничего не происходит. До вызова конструктора Thread() дело не доходит. С aiobot() аналогично.
Еще раз:
pyrobot() - вызов функции
pyrobot - ссылка на функцию
EDIT:
Оба бота - асинхронные на базе asyncio, им для работы нужен цикл-реактор (
event loop). Вообще не факт, что хорошая идея запускать их в потоках.
Тут есть два варианта, сразу даже не скажу, что проще.
Вариант А, лобовой: каждый бот создаёт своё собственные реактор через
asyncio.new_event_loop()
, потом задаёт его как текущий для своего потока через
asyncio.set_event_loop(loop)
. Если ботам не требуется взаимодействовать, то это может быть проще. Если требуется... будут проблемы. Два реактора в одной программе - это не хорошо.
Вариант Б, адекватный:
И вызов
app.run()
, и вызов
executor.start_polling(dp, skip_updates=True)
скорее всего под капотом создают асинхронную функцию (корутину), и запускают её в реакторе. Тогда ты можешь обойтись без потоков, заставив обоих ботов работать на одном реакторе. Нужно будет зарыться в доки, или даже глянуть исходники.
Например, для пирограмма
написано такое:
When calling this method (app.run()) without any argument it acts as a convenience method that calls start(), idle() and stop() in sequence. It makes running a single client less verbose.
Т.е. вместо вызова app.run() ты можешь изменить код так:
async def pyrobot(): # обрати внимание, теперь функция асинхронная!
print("pyro started")
@app.on_message(filters.chat("some_chat"))
async def print_pyrogram():
print("Pyrogram")
# это вместо вызова app.run(), как написано в доках.
await app.start()
try:
await app.idle()
finally:
await app.end()
Затем делаешь аналогичный трюк с aiobot(). Нужно посмотреть в доках на аиограм, как именно.
И потом запускаешь обоих ботов кодом вида...
asyncio.run(asyncio.gather(pyrobot(), aiobot()))