Сыктывкариум
И эти 2 файла надо скачать другим сервером. И оповестить, что первый сервер оба файла отдал.
Alex
gunicorn с гевент воркером
итак что мешает запустить в гуникорне количество воркеров по количеству ядер.
Tishka17
итак что мешает запустить в гуникорне количество воркеров по количеству ядер.
дай угадаю: он хочет emit который работает в пределах одного процесса
Alex
дай угадаю: он хочет emit который работает в пределах одного процесса
ну так у него сокетио подключение в рамках одного процесса и будет обрабатываться нет?
Сыктывкариум
Tishka17
send_file это фласк?
это линукс, детка
Alex
send_file это фласк?
это системный вызов
Сыктывкариум
Эм.
Alex
а я все ещё не понимаю, что ему это даст
размазывание нагрузки по нескольким ядрам как он того хочет.
Сыктывкариум
это линукс, детка
Серв на винде.
Alex
да я пока не вижу нагрузку
да я тоже. но это выглядит как очевидное решение в такой архитектуре
Tishka17
Серв на винде.
тогда не знаю
Alex
Серв на винде.
тогда страдай
Сыктывкариум
тогда страдай
Спс. Охуенный совет.
Сыктывкариум
А есть ещё один, менее охуенный? Например реализация нттп-сервера не через HttpServer?
Сыктывкариум
А он сможет на почту послать сообщение о том, что файлы загружены?
Сыктывкариум
Я проверил на маленьком файле - отработало нормально. На большом - соединение обрывается.
Tishka17
А он сможет на почту послать сообщение о том, что файлы загружены?
нет, но за ним ты сможеш ьпостаивт ьсвой сервер который будет обрабатывать POST запрос, который пошлет клиент после скачивания файлов
Tishka17
Я проверил на маленьком файле - отработало нормально. На большом - соединение обрывается.
реалньо, не делай read всего сразую Читай по 100к например и посылай
Tishka17
Настало время охуительных решений.
ну у тебя же и так будет два гета для файлов, а потом пост на отправку сообщения, не?
Egor
размазывание нагрузки по нескольким ядрам как он того хочет.
вот по конкретике: gunicorn -b 127.0.0.1:5000 -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 4 app:app выдает [2019-06-10 07:19:25 +0000] [3707] [INFO] Starting gunicorn 19.9.0 [2019-06-10 07:19:25 +0000] [3707] [INFO] Listening at: http://127.0.0.1:5000 (3707) [2019-06-10 07:19:25 +0000] [3707] [INFO] Using worker: geventwebsocket.gunicorn.workers.GeventWebSocketWorker [2019-06-10 07:19:25 +0000] [3710] [INFO] Booting worker with pid: 3710 [2019-06-10 07:19:25 +0000] [3711] [INFO] Booting worker with pid: 3711 [2019-06-10 07:19:25 +0000] [3712] [INFO] Booting worker with pid: 3712 [2019-06-10 07:19:25 +0000] [3714] [INFO] Booting worker with pid: 3714 [2019-06-10 07:19:26,061] [LAUNCH] Monitoring active jobs [2019-06-10 07:19:26,135] [LAUNCH] Monitoring active jobs [2019-06-10 07:19:26,182] [LAUNCH] Monitoring active jobs [2019-06-10 07:19:26,215] [LAUNCH] Monitoring active jobs [2019-06-10 07:19:28,796] Invalid session fc59d656b4c148d689b564b91b0e7882 [2019-06-10 07:19:28,796] Invalid session 087b23d6732b4d3ba65668ce06fc13ef [2019-06-10 07:19:28,797] Invalid session fc59d656b4c148d689b564b91b0e7882 [2019-06-10 07:19:28,804] Invalid session 75572255681047bd9e63f9b97c0350b7 [2019-06-10 07:19:28,805] Invalid session 75572255681047bd9e63f9b97c0350b7 [2019-06-10 07:19:28,805] Invalid session fd0499c6da3f4d24bffb63f7cbcb4ed3 [2019-06-10 07:19:28,808] Invalid session fd0499c6da3f4d24bffb63f7cbcb4ed3 [2019-06-10 07:19:28,834] Invalid session e6832a0fa6254708acf49218ba5dcb11 [2019-06-10 07:19:28,837] Invalid session 087b23d6732b4d3ba65668ce06fc13ef [2019-06-10 07:19:28,869] Invalid session fc59d656b4c148d689b564b91b0e7882 [2019-06-10 07:19:28,912] Invalid session fd0499c6da3f4d24bffb63f7cbcb4ed3 [2019-06-10 07:19:29,317] [rt_1559914477.164] Watching... [2019-06-10 07:19:29,397] [rt_1559914477.164] Watching... [2019-06-10 07:19:29,481] [rt_1559914477.164] Watching... [2019-06-10 07:19:29,525] [rt_1559914477.164] Watching...
Egor
то есть все задачи делаются одновременно 4 раза
Tishka17
вот по конкретике: gunicorn -b 127.0.0.1:5000 -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 4 app:app выдает [2019-06-10 07:19:25 +0000] [3707] [INFO] Starting gunicorn 19.9.0 [2019-06-10 07:19:25 +0000] [3707] [INFO] Listening at: http://127.0.0.1:5000 (3707) [2019-06-10 07:19:25 +0000] [3707] [INFO] Using worker: geventwebsocket.gunicorn.workers.GeventWebSocketWorker [2019-06-10 07:19:25 +0000] [3710] [INFO] Booting worker with pid: 3710 [2019-06-10 07:19:25 +0000] [3711] [INFO] Booting worker with pid: 3711 [2019-06-10 07:19:25 +0000] [3712] [INFO] Booting worker with pid: 3712 [2019-06-10 07:19:25 +0000] [3714] [INFO] Booting worker with pid: 3714 [2019-06-10 07:19:26,061] [LAUNCH] Monitoring active jobs [2019-06-10 07:19:26,135] [LAUNCH] Monitoring active jobs [2019-06-10 07:19:26,182] [LAUNCH] Monitoring active jobs [2019-06-10 07:19:26,215] [LAUNCH] Monitoring active jobs [2019-06-10 07:19:28,796] Invalid session fc59d656b4c148d689b564b91b0e7882 [2019-06-10 07:19:28,796] Invalid session 087b23d6732b4d3ba65668ce06fc13ef [2019-06-10 07:19:28,797] Invalid session fc59d656b4c148d689b564b91b0e7882 [2019-06-10 07:19:28,804] Invalid session 75572255681047bd9e63f9b97c0350b7 [2019-06-10 07:19:28,805] Invalid session 75572255681047bd9e63f9b97c0350b7 [2019-06-10 07:19:28,805] Invalid session fd0499c6da3f4d24bffb63f7cbcb4ed3 [2019-06-10 07:19:28,808] Invalid session fd0499c6da3f4d24bffb63f7cbcb4ed3 [2019-06-10 07:19:28,834] Invalid session e6832a0fa6254708acf49218ba5dcb11 [2019-06-10 07:19:28,837] Invalid session 087b23d6732b4d3ba65668ce06fc13ef [2019-06-10 07:19:28,869] Invalid session fc59d656b4c148d689b564b91b0e7882 [2019-06-10 07:19:28,912] Invalid session fd0499c6da3f4d24bffb63f7cbcb4ed3 [2019-06-10 07:19:29,317] [rt_1559914477.164] Watching... [2019-06-10 07:19:29,397] [rt_1559914477.164] Watching... [2019-06-10 07:19:29,481] [rt_1559914477.164] Watching... [2019-06-10 07:19:29,525] [rt_1559914477.164] Watching...
что это?
Сыктывкариум
ну у тебя же и так будет два гета для файлов, а потом пост на отправку сообщения, не?
Да. И я почему-то думал, что проще в питоне написать 10 строк, которые будут в зависимости от гетов отдавать файлы, а по посту - тормозить скрипт.
Egor
это запуск гуникорна с 4 воркерами (по кол-ву ядер)
Egor
дальше я копать в эту сторону не стал, и убрал это безобразие)
Egor
по обыкновению я стартую с одним воркером, и параллелить хочу именно запуск одной функции по сути, в цикле
Egor
изи решением был бы мультипроцессинг но он поломает вебсокеты
Tishka17
это запуск гуникорна с 4 воркерами (по кол-ву ядер)
Так. Давай расскажу как бы я делал: 1. Разедлил socketio и обработчик зарпосов на 2 разных процесса. Для простоты считал что они иногда могут быть запущены на разных серверах 2. Так как обработчик запросов теперь staeless и все сохраняет в БД или внешнем сервисе, можно много копий его запускать 3. Если понятно, что socketio грузит одно ядро под завязку и не хватате - сделал бы несколько копий, но каждая должна обрабатывать определенный task или связываться с конкретными клиентом.
Tishka17
да не ломает мультипроцессинг вебсокеты. Вебсокет должен обрабатываться одним процессом
Egor
то есть отдельный сервис решающий 1 задачу)
Tishka17
какой нафиг стрим
Egor
боже
Egor
ну я выше писал
Tishka17
ты же только что сказал что стрим - просто опрос спланка
Egor
функцию в которой поллинг спланка для конкретной задачи
Tishka17
не надо его стартовать
Tishka17
он всегда запущен
Tishka17
ну запусти
Egor
ну запусти
ну вот его то и надо запускать отдельым процессом
Egor
в этом вся проблема
Tishka17
ну и запускай
Egor
не будет работать сокетио так
Tishka17
да почему?
Tishka17
а. ты хочешь emit?
Tishka17
я понятия не имею что делает emit
Tishka17
посылает сообщение?
Tishka17
та кдля оптравки сообщений есть серверы сообщений
Egor
а. ты хочешь emit?
да. внутри этого стрима делаются emit (отправляет сообщение сокетио на фронт в определенный неймспейс)
Tishka17
так блин
Tishka17
внутри стрима или внутри фалска?
Tishka17
тогда я не понимаю в чем рпоблема
Egor
внутри стрима или внутри фалска?
стрим же сам внутри фласка
Egor
короче давай проще
Egor
не буду упоминать слово стрим
Egor
щас покажу
Egor
""" Запуск стрима для существующих джоб и для НОВЫХ """ def watch_new_jobs(): log.warn('[LAUNCH] Monitoring active jobs') db = DB('WATCHDOG') for j in job.get(): # watch_events.delay(j["id"]) gevent.spawn(watch_events(j["id"])) for change in db.r.table('jobs').changes().run(db.conn): socketio.emit('event', {'data': job.get()}, namespace='/jobs') if change['new_val']: # watch_events.delay(change['new_val']['id']) gevent.spawn(watch_events(change['new_val']['id'])) gevent.spawn(watch_new_jobs)
Anonymous
почему zip data.zip /content/data/ создает врхив с пустыми папками content и data? там около 2гб данных во вложенных файлах должно быть
Tishka17
1. Есть обработчик запросов GET/POST/... 2. Есть вебсокеты. Это две разные вещи и не надо их смешиват в один процесс
Egor
при запуске фласкоприложения стартует вот этот поток
Tishka17
зачем тебе переменное число стримов?
Egor
функцмия watch_events(sid) и есть этот стрим
Egor
зачем тебе переменное число стримов?
потому что поисков может быть разное количество
Egor
1 стрим == 1 поиск в спланке
Tishka17
а почему один стрим не может опрашивать несколько поисков?
Egor
точнее даже сказать не поиск, а задача
Egor
а почему один стрим не может опрашивать несколько поисков?
придется писать сложную логику в стриме, и не факт что это оптимизирует нагрузку
Tishka17
и второй вопрос - почему вообще надо несколько стримов для опроса? Почему нельзя из одного опрашивать все поиски?
Tishka17
откуда там логика, ты же просто результат получаешь