Раздор бот и бутылка одновременно в Python - PullRequest
0 голосов
/ 19 сентября 2018


Я пытаюсь создать API для бота с бутылкой, чтобы использовать такие команды, как http://localhost:8080/say/serverId/channelId/Message
Я попытался успешно напечатать сообщение с URL и бутылкой, и у меня есть бот Discord, теперь я долженслияние двух.Поэтому я хочу запустить бутылку и разлад в одно и то же время, в одном сценарии.Я искал и есть потоки, IPC и т.д ... Но эти решения выглядит трудно, я новичок.
Так у вас есть простое решение для этого?Я попытался

bot.run(token)
bottle.run(host="localhost", port=8080)

, но бот запускается, и я должен остановить его с помощью CTRL + C, чтобы запустить бутылку.Также, если у вас есть более простое решение, но с двумя сценариями, почему бы и нет, но мне нужна переменная bot в сценарии бутылки, чтобы отправить сообщение
Спасибо!

1 Ответ

0 голосов
/ 19 сентября 2018

Проблема здесь в том, что bottle.py представляет собой среду WSGI, основанную на блокирующем коде, а discord.py - это асинхронная неблокирующая библиотека asyncio, которая использует цикл обработки событий.

Возможны следующие варианты:

  • удалить bottle в пользу некоторого другого веб-фреймворка, который фактически является асинхронным (например, grole или sanic).

  • Используйте какую-нибудь обертку, например aiobottle, чтобы каким-то образом заставить бутылку играть с asyncio (или создать свою собственную).

Я бы выбрал первый вариант.

После использования некоторого совместимого фреймворка или оболочки, вы должны запустить цикл обработки событий только один раз, так как он будет использоваться для обоих приложений.Это означает, что вы не можете вызывать оба run метода.

Пример для sanic:

# `bot.run` starts the event loop, avoid it and use `bot.start` instead
bot_app = bot.start(token)
bot_task = asyncio.ensure_future(bot_app)

# create the sanic app server, but without starting it:
webserver = app.create_server(host="0.0.0.0", port=8080)
webserver_task = asyncio.ensure_future(webserver)

#finally, start the event loop:
loop = asyncio.get_event_loop()
loop.run_forever() # runs both tasks at the same time
...