5

Сайт для сервера

Делаю свою онлайн игру на питоне(3.11), с помощью библиотеки pygame(2.5.2). И вот я реализовал клиент, реализовал сервер, но так же потребовалось сделать веб-сайт на фреймворке flask(3.0.2), на котором будут отображаться основные данные о сервере. Обычное(последовательное) программирование отпало сразу. Стал пробовать выполнять задачу через асинхронное программирование, библиотека asyncio, пытался запускать функции через метод "create_task"(обе запускаемы таким образом функции я переделал в асинхронные), однако при запуске программы я получаю следующую ошибку: "RuntimeError: no running event loop; sys:1: RuntimeWarning: coroutine 'main' was never awaited". Ошибку я перевёл, но так и не понял, что она значит. Если здесь есть люди, которые разбираются в подобном, подскажите пожалуйста, как эту ошибку починить? Заранее спасибо за оставленные советы и критику.

P.S. Если понадобится ещё какая-то информация, то вот гитхаб проекта, файл main.py - клиент, server_test.py - сервер.

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

0
Автор поста оценил этот комментарий
Ни хуя не понял. Но в ответах, сегодня переборщил с иронией и сарказмом. И на хуй посылал, и самое главное не соглашался с мнением.
Так вот, тебе плюс, без хуёв и прочего.
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

И на этом спасибо)

0
Автор поста оценил этот комментарий

Это курсовая работа? Похоже на то, что эта работа должна проверить знания по сетевому программированию. Если вы принесёте скрипт, в котором находится и клиент, и сервер игры, и веб-сервер для оценки состояния сервера игры, то такую работу, вероятнее всего, не примут.


Нужно сначала написать сервер игры, к которому будут подключаться клиенты. Который можно будет запустить на арендованном VPS. Или на сервере в аудитории.


Потом нужно написать клиент игры, который будет связываться с сервером с помощью сокетов. Экстремально простой пример клиент-серверного приложения можно почитать в статье https://habr.com/ru/articles/149077/ и ничего страшного, что ей уже двенадцать лет, потому что с тех пор с сокетами ничего глобально не изменилось.


А уже потом нужно написать веб-сервер, который будет получать данные от сервера игры. Синхронный Flask без проблем для этого подойдёт, и его можно будет разместить на арендованном VPS, который вообще будет находиться в другом месте, например. Но это ТРИ разных "программы", а не одна! И сервер игры должен прослушивать сокет, через который с ним будет общаться веб-сервер, и отправлять ему необходимые данные.


Вам нужно принести в доказательство сделанной курсовой три папки со скриптами, а не одну.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

0
Автор поста оценил этот комментарий

Обычное(последовательное) программирование отпало сразу.

Почему?


Flask действительно можно заставить работать асинхронно, но зачем? Есть фреймворк FastAPI, который выглядит как Flask, но при этом асинхронный изначально, почему бы не использовать его?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Это хороший вопрос, спасибо за него. Дело в том, что пока что я учусь, и этот проект является и моей курсовой работой, и тем проектом, который мне хочется развивать дальше и дальше. Одно из требований этого курса к работе, в том что там должен использоваться фреймворк flask с соответствующей библиотекой и с некоторым функционалом обсуждённым ранее в курсе, такой как регистрация, использование шаблонов и много чего ещё(но эти задачи я, пожалуй оставлю за собой).

показать ответы
2
Автор поста оценил этот комментарий
Дружище нужно осились книжку по асинхронному програмиированию. Я нппример учился по Фраулеру: https://www.labirint.ru/books/900476/

Легко ггуглится бесплатно.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо за совет, если будет время, почитаю.

10
Автор поста оценил этот комментарий
**Ошибка "no running event loop"** означает, что ваша программа пытается выполнить асинхронную операцию (функцию coroutine), но у нее нет запущенного цикла событий. Цикл событий необходим для выполнения асинхронного кода.

**Как исправить ошибку**

Чтобы исправить ошибку, вам нужно запустить цикл событий в вашей программе. Это можно сделать следующим образом:

```python
if __name__ == "__main__":
# Создаем экземпляр приложения Flask
app = Flask(__name__)

# Запускаем цикл событий Flask
app.run()
```

Здесь `app.run()` запускает встроенный веб-сервер Flask и встроенный цикл событий. Теперь любые асинхронные функции, которые вы запускаете с помощью `create_task`, будут выполняться в этом цикле событий.

**Понимание сообщения об ошибке**

* **RuntimeError: no running event loop** означает, что на момент выполнения асинхронной функции нет запущенного цикла событий.
* **sys:1: RuntimeWarning: coroutine 'main' was never awaited** предупреждает о том, что coroutine `main` (главная функция вашей программы) никогда не была ожидаема. В асинхронном программировании ожидаемые coroutine приостанавливаются и возобновляются циклом событий, поэтому эту ошибку следует устранять.

**Дополнительные советы**

* Не забудьте запустить цикл событий в главной функции программы (часто называемой `main`).
* Используйте `await` для ожидания выполнения асинхронных функций.
* Вы можете использовать `asyncio.run()` как более краткий и простой метод запуска асинхронных функций в основном цикле событий.

Ваш код будет выглядеть примерно так:

```python
if __name__ == "__main__":
from asyncio import run

# Асинхронные функции
async def handle_socket():
pass

async def handle_web_requests():
pass

# Запуск асинхронных функций
run([handle_socket(), handle_web_requests()])

# Запуск веб-сервера Flask
app.run()
```

Теперь ваши асинхронные функции будут выполняться в цикле событий, и ошибка должна быть устранена.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо за ответ, однако при попытке запуска подобной программы запускается только функция отвечающая за саму игру, после закрытия окна сервера flask подал признаки жизни, однако тут же упал с ошибкой "Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)", хотя я использую разные порты. Что можно попробовать сделать ещё?(версию программы, выдающую эту ошибку я запушил на случай надобности).

0
Автор поста оценил этот комментарий

Хорошо, пусть будет Flask. А почему "обычное(последовательное) программирование отпало сразу"?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Потому что тогда не смогут одновременно идти процессы и основного сервера, и сайта. Ну и или я чего-то не понимаю.

показать ответы
0
Автор поста оценил этот комментарий

Блин. В моём понимании "онлайн игра" означает, что с локального компьютера запускается клиент и обменивается данными с сервером, на который шлют данные и все остальные игроки (клиенты). Игра отдельно, сервер для игры отдельно, веб-сервер для сервера игры отдельно. Если сделать так, то никаких проблем не будет.


Почему бы не запускать сервер Flask отдельно от игры? И какой смысл в том, что это всё будет в одном скрипте?


Вы сейчас сможете запустить три игры на одном компьютере и поиграть вместе?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

В теории да, но как тогда программа вебсайта будет получать данные из сервера?(на самом деле я так уже пробовал, импортировал нужные переменные из файла сервера, но ничего дельного из этого не вышло)

0
Автор поста оценил этот комментарий

Блин. В моём понимании "онлайн игра" означает, что с локального компьютера запускается клиент и обменивается данными с сервером, на который шлют данные и все остальные игроки (клиенты). Игра отдельно, сервер для игры отдельно, веб-сервер для сервера игры отдельно. Если сделать так, то никаких проблем не будет.


Почему бы не запускать сервер Flask отдельно от игры? И какой смысл в том, что это всё будет в одном скрипте?


Вы сейчас сможете запустить три игры на одном компьютере и поиграть вместе?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Однако, спасибо за этот комментарий, Вы меня натолкнули на другую идею, если выйдет, отпишусь.

показать ответы
0
Автор поста оценил этот комментарий
Просто оставлю это здесь

https://m.youtube.com/playlist?list=PLlWXhlUMyooawilqK4lPXRv...
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо, когда освободится минутка посмотрю.

показать ответы