Tishka17
или ты что-то ещё с ним делаешь?
Egor
го в личку?
Tishka17
я думаю алексу тоже интересно
Egor
можем сообразить на троих
Egor
ахахха
Tishka17
Так ты что-то ещё считашеь что ли после получения из спланка?
Egor
Так ты что-то ещё считашеь что ли после получения из спланка?
понимаешь в чем дело, теоретически вопрос хороший. я могу передавать в один стрим список ID спланковских задач, и будет только одна запущенная функция watch_events() (стрим), внутри которого будет отправка сразу многих socketio сообщений в разные неймспейсы. но зачем это делать, если достаточно просто для каждого существующего id задачи запускать стрим в процессе. другой вопрос что это ломает сокетио
Egor
а если запускать таску в celery то не ломает
Tishka17
да забудь про celery. Он расчитан на такски, а у тебя не таск, а процесс долгоживущий
Tishka17
а остальные процессы не в курсе ничгео об этом таске
Egor
так, давай вернемся. А почему это ломает socketio? Вот ты запустил несколько socketio процессов. Перед ними nginx. Клиент подключился к какому-то и сказал какой таск он слушает, ты запустил стрим и обслуживаешь его
все верно, давай тогда определим такую вещь. На данный момент в __init__.py сокетио иницилизизируется вот так: socketio = SocketIO(app) Как я понимаю, в принципе мою задачу можно решить, инициализируя его внутри моей функции watch_events()
Egor
то есть вместо app должен быть другой оъект
Tishka17
нет
Tishka17
просто запусти несколько копий на разных портах и через nginx балансируй
Egor
просто запусти несколько копий на разных портах и через nginx балансируй
тогда речь уже идет об использовании микросервисов же
Tishka17
это не микросервисы, это масштабирование =)
Tishka17
микросервисы про другое
Tishka17
несколько копий процесса - это не микросервисы. =)
Egor
хм
Egor
как-то дрочно все это на самом деле
Egor
по логике должен быть мультипроцессинг
Egor
он прямо ложится на логику
Egor
но зараза вебсокеты подкидывают собаку
Tishka17
Я все ещё не вижу собаку
Egor
видимо тут не попробуешь не увидишь
Egor
flask_socketio просто берешь, поднимаешь сначала в обычном фласке, затем суешь отправку сообщения в некий модуль с функцией, под которую выделяется полток - и оказывается, что без gevent или greenlet работать не будет вообще
Egor
а из multiprocessing.Process уже сам gevent и greenlet не работает
Egor
итого процесс то сам запустится, принты отпринтятся, действия выполнятся, а сообщения по socketio не отправятся, как будто их и не было
Egor
я с этой ебалайкой полгода назад возился месяц не меньше, и сейчас уже почти неделю
Anonymous
почему zip data.zip /content/data/ создает врхив с пустыми папками content и data? там около 2гб данных во вложенных файлах должно быть
Tishka17
итого процесс то сам запустится, принты отпринтятся, действия выполнятся, а сообщения по socketio не отправятся, как будто их и не было
Почему не запустятся? У тебя разные коннекты от клиента приедут на разные сервера. И каждый пусть отсылает что хочет
Tishka17
Или ты хочешь один Коннект с клиентом и много стримов?
Egor
Почему не запустятся? У тебя разные коннекты от клиента приедут на разные сервера. И каждый пусть отсылает что хочет
не запустится потому что gevent не будет работать с процессом, и задача на отправку сообщения с точки зрения синтаксиса ошибку не выдаст, но работать не будет. просто будет делать ничего.
Egor
при этом если создавать не в процессе а в треде - все работает
Tishka17
Блин, просто две абсолютно одинаковые копии процесса отдельно запустить
Tishka17
Не из кода
Tishka17
Просто отдельно
Tishka17
И каждый пусть держит Коннект с какими-то клиентом
Egor
Блин, просто две абсолютно одинаковые копии процесса отдельно запустить
тогда работать будет, но я считаю что это какой-то костыль. да и что будет отвечать за запуск этих процессов, ведь количество Клиентов будет все время разным
Egor
от 0 до 30 например
Tishka17
И под каждый Коннект с клиентом - стрим
Tishka17
Никто. Число процессов по числу ядер
Tishka17
Фиксированное
Tishka17
А внутри каждого уже твой гевент
Egor
а что будет раскидывать "стримы" по этим процессам?
Tishka17
Клиент лезет с указанием стрима и попадает на какой-то сервер.
Tishka17
А там при коннекте клиента стрим и запускается
Tishka17
Но если у тебя будут сотни клиентов, это все выглядит все ещё стрёмно
Anonymous
тишка
Tishka17
Потому что ты так и не объяснил, почему поллинг у тебя жрет так многл
Egor
тогда еще уточню, на фронте используется Vue.js с клиент-сайд рендерингом. Положим что страница открыта в браузере у одного клиента. На странице дашборд с 13 окошками - каждое из них это экземпляр компонента vue.js в котором открывается socketio.on (сокетио сервер, который ловит сообщения)
Egor
вопрос
Egor
это сколько клиентов?)
Egor
1 или 13?)
Egor
не думаю что в данном случае нджинкс что-то поймет
Egor
у него есть location для сокетио, и все
Egor
ну и число 13 здесь условное, их может быть 0 а может быть 20
Egor
и эту страницу одновременно может так-то открыть несколько человек
Egor
Много?
допустим раз 10
Tishka17
Ну ещё вариант - разделить поллинг спланка (раз он медленный) и отправку клиенту
Tishka17
Но имхо, надо чтобы поллинг больше одного таска брал
Alex
Ну ещё вариант - разделить поллинг спланка (раз он медленный) и отправку клиенту
так что пришли к варианту нескольких инстансов фласка?
Tishka17
правда я так и не понял что у него CPU ест
Alex
я правда немного не понимаю зачем там фласк ко всему этому ну да ладно
Tishka17
как мне в typing указать что параметр - датакласс?
Aragaer
ну у него же есть тип
Tishka17
какой?
Aragaer
такой, который у него есть
Tishka17
не
Tishka17
у меня функция сейчас имеет вид def some(class_: Type): f = dataclass.fields(class_) ...
maxlunar
https://stackoverflow.com/questions/54668000/type-hint-for-an-instance-of-a-non-specific-dataclass чекни, не оно?
Tishka17
вот надо не Type а именно что датакалсс
Tishka17
ну понятно, протокол