Real-time - это, наверное, long-polling, когда сервер и клиент подолгу держат соединение открытым, в противовес обычному вебу, где 1 запрос открывает соединение, ждёт ответа и сразу закрывает его. Для этого обычно используют многопоточные и/или асинхронные штуки.
Со стороны клиента это реализуется через WebSocket (современный вариант), либо другими хитрыми методами. Протокол websocket поддерживают многие браузеры, однако есть
SockJS, который в случае чего прозрачно меняет протокол на другой доступный. Там же есть ссылки на реализацию этого протокола для других языков.
Со стороны сервера:
Для питона - это tornado и asyncio (только для 3-й ветке, включён в стандарт). Можно писать в коллбечном стиле, можно в обычном с использованием корутин (сопрограмм). Tornado умеет sockjs, вебсокет есть для обеих вариантов.
Java сама по-себе многопоточна, поддержка websocket включена в стандарт JavaEE. Помимо этого есть решения для спринга. Это удобно, потому что нужен всего 1 фреймворк и для обычной части сайта (если такая есть), и для его асинхронной части. Есть очень производительный сервер netty с неблокирующим вводом-выводом и апи к нему.
И т.д.
В принципе, почти для каждого языка есть свой неблокирующий сервер и фреймворк к нему. Просто смотри на тот язык, который удобнее и для которого есть большая инфраструктура.