Бот, работающий одновременно в VK и Discord

Кратко о проблеме: Есть код для бота дискорда, который успешно подключается и работает. Есть код для бота вк, который успешно подключается и работает. Нет кода для бота, который успешно работает в вк и дискорде!

import discord

import vk_api
import vk
from vk_api import VkUpload
from vk_api.utils import get_random_id

vk_session = vk_api.VkApi(token='TOKEN')
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
longpoll = VkBotLongPoll(vk_session, 'ID')
vk = vk_session.get_api()
from vk_api.longpoll import VkLongPoll, VkEventType
Lslongpoll = VkLongPoll(vk_session)
Lsvk = vk_session.get_api()

def vk():
    for event_vk in longpoll.listen():
        print('Event')

client = discord.Client()


@client.event
async def on_ready():
    await client.change_presence(status=discord.Status.idle)
    print('Connected')


vk()   
client.run('TOKEN')

Выглядит это примерно так. И в зависимости от того, что происходит раньше - vk() или client.run() зависит, какой из ботов работает. Подскажите, пожалуйста, в каком направлении копать? Я совсем новичок в программировании, и моя проблема скорее всего в том, что по незнанию я не замечаю какую-то совсем очевидную причину.

UPD1: После некоторых тестов выяснилось, что проблема, вероятно, в том, что не происходят никакие другие события, если longpoll.listen(). Тогда вопрос в том, как делать это асинхронно.


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

Автор решения: Mus1k

Используйте мультипоточность.

import discord

import vk_api
import vk
from vk_api import VkUpload
from vk_api.utils import get_random_id
from threading import Thread # Импортируем нужную библиотеку

vk_session = vk_api.VkApi(token='TOKEN')
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
longpoll = VkBotLongPoll(vk_session, 'ID')
vk = vk_session.get_api()
from vk_api.longpoll import VkLongPoll, VkEventType
Lslongpoll = VkLongPoll(vk_session)
Lsvk = vk_session.get_api()

def vk():
    for event_vk in longpoll.listen():
        print('Event')

client = discord.Client()


@client.event
async def on_ready():
    await client.change_presence(status=discord.Status.idle)
    print('Connected')


vk() 
#client.run('TOKEN') # Это заменяем на то, что ниже.

# +++
def run_ds_bot():  # создаем отдельную функцию для запуска бота Discord
    client.run('TOKEN')

thr1 = Thread(target=vk) # Создаем поток с функцией vk()
thr2 = Thread(target=run_ds_bot) # Создаем поток с функцией run_discord_bot()
thr1.start() # Запускаем поток с функцией vk()
thr2.start() # Запускаем поток с функцией run_discord_bot()
→ Ссылка