
Alex
23.11.2018
23:32:29
> По логике необходимо выделять один поток для одного залогиненного юзера
Эм…. вот так делать точно не надо.

Егор
23.11.2018
23:33:44
а как посоветуете? мне ранее не приходилось продумывать логику использования потоков в приложении, так что изобретаю велосипед. Обзорной инфы на этот счет нагуглить как-то не вышло

Никита
23.11.2018
23:35:00
Полно информации по этому поводу

Google

Alex
23.11.2018
23:37:13

Егор
23.11.2018
23:38:08
Полно информации по этому поводу
преимущественно есть либо документация к библиотекам, либо простые примеры их применения, а ответа на вопрос как правильно использовать потоки для веб-приложения с сокетами, я не нашел. Приходится собирать информацию об этом по крупицам
может получится)

Alex
23.11.2018
23:39:02
откуда такой вопрос вообще возник? повторюсь, на кой хрен там потоки?

Егор
23.11.2018
23:39:51
на сколько я понял, так как соединение по вебсокетам, в отличии от реста, происходит постоянно, необходимо для каждого такого соединения выделять отдельный поток

Alex
23.11.2018
23:40:59
gevent не?
в общем, читай документацию по flask-socketio.
и какие-нибудь основы по асинхронному вводу-выводу \ работе с сетью.

Егор
23.11.2018
23:42:42
я ручками эти потоки не создаю, они же по идее должны сами создаваться, как раз, при использовании gevent, как это описано в ссылке на документацию выше
ок, спасибо

Alex
23.11.2018
23:43:52
цикл обработки сообщений (в gevent включительно) работает тащем-та в одном потоке ОС…
> я ручками эти потоки не создаю
> если убивать текущий поток (получается через del threading._active[threading.current_thread().ident] )
это какой-то сюр

Google

Alex
23.11.2018
23:55:30
> на бэке создается от одного до несколььких потоков, при следующих обновлениях количество потоков увеличивается
как ты определил, что количество потоков увеличивается?

Никита
24.11.2018
00:00:37
Нельзя же просто взять технологию не понимая что она делает

Alex
24.11.2018
00:02:03
чтобы использовать flask-socketio глубоких познаний в механизмах работы gevent для начала не требуется.

Егор
24.11.2018
00:17:23
при обновлении страницы на сайте
это и есть те самые легковесные потоки?
я совсем забыл указать на еще один аспект - в приложении используется rethinkdb changefeeds - подписка на обновление данных в таблице feed = r.table('messages').filter({'sender': payload['user_id']}).changes().run(conn)
for change in feed:
logging.warning(change)
socketio.emit('push', str(change), namespace='/websocket/user_' + str(change['new_val']['sender']))

Alex
24.11.2018
00:21:45

Егор
24.11.2018
00:22:06
ну в общем да

Alex
24.11.2018
00:22:44
как я уже сказал это просто имя потока, это не значит что запущено 12 потоков

Егор
24.11.2018
00:22:44
не нашел ни одной доки где ясно было бы написано как с этим работать
понял

Alex
24.11.2018
00:23:15
ps \ top \ htop

Егор
24.11.2018
00:25:35
на самом деле смутило еще и то, что logging.warning(threading.enumerate()) отображает словарь в котором скапливаются все эти "имена"
на сколько понмю, enumerate как раз возвращает список активных потоков

Alex
24.11.2018
00:27:04

Егор
24.11.2018
00:30:59

Google

Егор
24.11.2018
00:31:28
несколько раз обновил страницу, список в логе - вывод logging.warning(threading.enumerate())
потому и возникло предположение что они накапливаются, а не просто именуются по разному
и да, когда отправляется уведомление по сокетио, оно в логе продублировано, сколько этих потоков в списке)

Alex
24.11.2018
00:34:13

Егор
24.11.2018
00:34:47
ага. на самом деле по ходу нашего обсуждения, появилась идея уменьшить количество "черных коробок" и выпилить gevent
и ручками создавать дополнительный поток там где это надо
может это манки патчинг так себя ведет, или моя неопытность не дает понять "очевидных" вещей
так что лучше так

Alex
24.11.2018
00:35:52

Егор
24.11.2018
00:35:57
почему же?
вы считаете что тут в принципе не нужна многопоточность?

Alex
24.11.2018
00:37:08
нет, просто во-первых ты по той же неопытности реализовать это корректно не сможешь (да и не факт что flask-socketio будет в этом случае работать).
во-вторых принцип по потоку на соединение не масштабируется.
+ оверхед на переключение контекста и память
читай c10k problem

Егор
24.11.2018
00:42:45
есть еще одна вещь которая вызывает смутные сомнения - для того чтобы использовать вот это https://rethinkdb.com/docs/changefeeds/python/ в моем апи существует один метод, внутри которого по сути вечный цикл for
когда фиксируется изменение в таблице, по вебсокету конкретному юзеру отправляется сообщение на фронт
я полагал что это все может быть в отдельном потоке, и цикл грохнется если этот поток завершится
это, выходит, тоже считается плохой практикой? чтобы уйти от концепции "поток на соединение"

Google

Егор
24.11.2018
00:45:46
и стоит запилить отдельный сервис под это дело, а не пихать его в апи

hachiman
24.11.2018
05:05:48
Что за прога: Проблемы, вывод, Консоль, отладки, терминал, 2: ssh ?

Андрей
24.11.2018
05:20:53
Схема бредовая, учите блоксхемы ГОСТ

Pablo
24.11.2018
05:25:22

Pavel
24.11.2018
05:31:35
Иф не срабатывает, а проверяется. И если проверка прошла, то выполняется первый кусок кода, а если не прошла - второй.

Егор
24.11.2018
05:32:41
Внутри которого в терминале запущен ssh до сервака где развернут бэк

hachiman
24.11.2018
05:35:54

Егор
24.11.2018
05:37:46

hachiman
24.11.2018
05:38:07

Егор
24.11.2018
05:38:35
local ?
VDS. Что конкретно в этом вызывает интерес?)

hachiman
24.11.2018
05:39:21

Егор
24.11.2018
05:40:53
Не всякие спешл-сервисы с урезанным линухом

hachiman
24.11.2018
05:42:51

Егор
24.11.2018
05:43:35

hachiman
24.11.2018
05:43:44

Google

Егор
24.11.2018
05:45:38
Думаю в рамках текущего чата это уже флуд, а вообще я сам джун, так что плохая идея)

hachiman
24.11.2018
05:47:21
Не хочешь как хочешь

Андрей
24.11.2018
07:04:46
Плохой стиль программирования: кроме POST & GET есть и другие запросы. Впрочем, по непричёсанному тексту понятно, что советы там те ещё...


Топ
24.11.2018
07:36:38
Привет
Народ, может кто помочь решить олимпиадную задачу (на Python)? Знаю что офф-топик , поэтому кину само задание в лс . Пожалуйста ?

Проксимов
24.11.2018
07:42:34

Топ
24.11.2018
07:44:57
кинул чекай лс
Как это на python решить ?

hachiman
24.11.2018
08:01:27
Привет
Привет, можно посмотреть на задачу ?

Топ
24.11.2018
08:05:27
Двоеборье
Соревнования по двоеборью проводятся в два тура. На каждом из туров участники получают некоторые баллы, причем баллы всех участников различны как на турах, так и в сумме за два тура. Считается, что участник занял место K, если ровно K-1 из участников набрали больше баллов, чем он.
Всего в соревновании участвовало N человек. На первом туре Вася занял место P, а на втором туре - место Q. Определите, какое минимальное и максимальное место мог занять Вася по сумме двух туров.
Формат входных данных
Во входных данных заданы три числа: N (1 ≤ N ≤ 109), P и Q (1 ≤ P, Q ≤ N).
Формат результата
Выведите два числа - минимальное и максимальное место, которое мог занять Вася.
Примеры
Входные данные
3 1 1
Результат работы
1 1
Входные данные
3 1 2
Результат работы
1 2
Входные данные
4 4 2
Результат работы
2 4


hachiman
24.11.2018
08:05:55
Двоеборье
Соревнования по двоеборью проводятся в два тура. На каждом из туров участники получают некоторые баллы, причем баллы всех участников различны как на турах, так и в сумме за два тура. Считается, что участник занял место K, если ровно K-1 из участников набрали больше баллов, чем он.
Всего в соревновании участвовало N человек. На первом туре Вася занял место P, а на втором туре - место Q. Определите, какое минимальное и максимальное место мог занять Вася по сумме двух туров.
Формат входных данных
Во входных данных заданы три числа: N (1 ≤ N ≤ 109), P и Q (1 ≤ P, Q ≤ N).
Формат результата
Выведите два числа - минимальное и максимальное место, которое мог занять Вася.
Примеры
Входные данные
3 1 1
Результат работы
1 1
Входные данные
3 1 2
Результат работы
1 2
Входные данные
4 4 2
Результат работы
2 4
Это и есть олимпиада ?