@ru_python

Страница 9291 из 9768
user753
10.06.2019
07:11:36
Господа, такой вопро. Надо поднять сервер, что бы он отдавал пару файлов. Сделал на HTTPServer. В BaseHTTPRequestHandler в do_GET есть такой код: file_path = curdir + sep + file_name f = open(file_path, 'rb') self.send_response(200) self.send_header('Content-Type', 'application/octet-stream') self.send_header('Content-Length', path.getsize(file_name)) self.send_header('Content-Disposition', 'attachment; filename="'+file_name+'"') self.end_headers() self.wfile.write(f.read()) f.close() проверил на маленьком файле (2 мб) - норм работает. Попробовал отдать 50 мб - браузер пишет, что соединение оборвано. Куда копать? Или может есть альтернатива HttpServer? мне надо по расписанию запустить сервак, что бы клиент скачал 2 файла, а потом вырубить сервак, т.е. надо отловить ГЕТ-запрос определённый и выключить сервер.

Егор
10.06.2019
07:11:43
а параллелить ты что тут собрался?
эти "стримы" которые опрашивают спланк и шлют сообщения на фронт по сокетам

они должны запускаться параллельно, оно так и работало на уровне потоков, но было ограничено 1 ядром

Google
Егор
10.06.2019
07:12:16
а я хочу чтобы при создании такого "стрима" запускался 1 процесс, а не 1 поток

Егор
10.06.2019
07:12:31
и тогда нагрузка будет размазываться уже операционной системой по сути

Alex
10.06.2019
07:12:33
а я хочу чтобы при создании такого "стрима" запускался 1 процесс, а не 1 поток
еще раз что мешает запустить несколько инстансов фласка.

Егор
10.06.2019
07:13:12
еще раз что мешает запустить несколько инстансов фласка.
я так понимаю что в данном случее придется распиливать приложение на микросервисы

ну я не особо силен в запуске нескольких воркеров для фласка

Tishka17
10.06.2019
07:13:40
я так понимаю что в данном случее придется распиливать приложение на микросервисы
ещё раз: нормальная практика - несколько ОДИНАКОВЫх процессов, которые делают одно и то же

Alex
10.06.2019
07:13:40
user753
10.06.2019
07:13:52
а почему нельзя было взять nginx?
Ради двух файлов поднимать нджинкс? В принципе ничего, но суть в том, что после того, как клиент скачает файлы и пошлёт нужный гет серверу, сервер вырубится и оповестит админа, что файлы были скачаны

Google
Егор
10.06.2019
07:14:43
чем ты фласк вообще запускаешь?
gunicorn с гевент воркером

user753
10.06.2019
07:14:48
ну всяко лучше чем поднимать самописный небезопасный говносервер
ну безопасность говносервера обеспечивается файрволом, который пускает на этот сервер только один комп.

user753
10.06.2019
07:15:36
И эти 2 файла надо скачать другим сервером. И оповестить, что первый сервер оба файла отдал.

Alex
10.06.2019
07:15:40
gunicorn с гевент воркером
итак что мешает запустить в гуникорне количество воркеров по количеству ядер.

Tishka17
10.06.2019
07:15:58
итак что мешает запустить в гуникорне количество воркеров по количеству ядер.
дай угадаю: он хочет emit который работает в пределах одного процесса

Alex
10.06.2019
07:16:20
дай угадаю: он хочет emit который работает в пределах одного процесса
ну так у него сокетио подключение в рамках одного процесса и будет обрабатываться нет?

user753
10.06.2019
07:16:20
Tishka17
10.06.2019
07:16:21
send_file это фласк?
это линукс, детка

Alex
10.06.2019
07:16:31
send_file это фласк?
это системный вызов

user753
10.06.2019
07:16:35
Эм.

Alex
10.06.2019
07:16:54
а я все ещё не понимаю, что ему это даст
размазывание нагрузки по нескольким ядрам как он того хочет.

user753
10.06.2019
07:17:00
это линукс, детка
Серв на винде.

Google
Tishka17
10.06.2019
07:17:02
Alex
10.06.2019
07:17:23
да я пока не вижу нагрузку
да я тоже. но это выглядит как очевидное решение в такой архитектуре

Tishka17
10.06.2019
07:17:24
Серв на винде.
тогда не знаю

Alex
10.06.2019
07:17:31
Серв на винде.
тогда страдай

user753
10.06.2019
07:17:42
тогда страдай
Спс. Охуенный совет.

А есть ещё один, менее охуенный? Например реализация нттп-сервера не через HttpServer?

user753
10.06.2019
07:18:27
А он сможет на почту послать сообщение о том, что файлы загружены?

Tishka17
10.06.2019
07:18:33
user753
10.06.2019
07:18:57
Я проверил на маленьком файле - отработало нормально. На большом - соединение обрывается.

Tishka17
10.06.2019
07:19:08
А он сможет на почту послать сообщение о том, что файлы загружены?
нет, но за ним ты сможеш ьпостаивт ьсвой сервер который будет обрабатывать POST запрос, который пошлет клиент после скачивания файлов

Я проверил на маленьком файле - отработало нормально. На большом - соединение обрывается.
реалньо, не делай read всего сразую Читай по 100к например и посылай

Tishka17
10.06.2019
07:19:55
Настало время охуительных решений.
ну у тебя же и так будет два гета для файлов, а потом пост на отправку сообщения, не?

Егор
10.06.2019
07:20:16
размазывание нагрузки по нескольким ядрам как он того хочет.
вот по конкретике: 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...

то есть все задачи делаются одновременно 4 раза

Tishka17
10.06.2019
07:20:29
вот по конкретике: 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...
что это?

user753
10.06.2019
07:20:34
ну у тебя же и так будет два гета для файлов, а потом пост на отправку сообщения, не?
Да. И я почему-то думал, что проще в питоне написать 10 строк, которые будут в зависимости от гетов отдавать файлы, а по посту - тормозить скрипт.

Егор
10.06.2019
07:20:42
это запуск гуникорна с 4 воркерами (по кол-ву ядер)

Google
Егор
10.06.2019
07:20:53
дальше я копать в эту сторону не стал, и убрал это безобразие)

по обыкновению я стартую с одним воркером, и параллелить хочу именно запуск одной функции по сути, в цикле

изи решением был бы мультипроцессинг но он поломает вебсокеты

Tishka17
10.06.2019
07:23:33
это запуск гуникорна с 4 воркерами (по кол-ву ядер)
Так. Давай расскажу как бы я делал: 1. Разедлил socketio и обработчик зарпосов на 2 разных процесса. Для простоты считал что они иногда могут быть запущены на разных серверах 2. Так как обработчик запросов теперь staeless и все сохраняет в БД или внешнем сервисе, можно много копий его запускать 3. Если понятно, что socketio грузит одно ядро под завязку и не хватате - сделал бы несколько копий, но каждая должна обрабатывать определенный task или связываться с конкретными клиентом.

да не ломает мультипроцессинг вебсокеты. Вебсокет должен обрабатываться одним процессом

Tishka17
10.06.2019
07:24:26
какой нафиг стрим

Егор
10.06.2019
07:24:31
боже

ну я выше писал

Admin
ERROR: S client not available

Tishka17
10.06.2019
07:24:43
ты же только что сказал что стрим - просто опрос спланка

Егор
10.06.2019
07:24:43
функцию в которой поллинг спланка для конкретной задачи

Tishka17
10.06.2019
07:24:46
не надо его стартовать

он всегда запущен

Егор
10.06.2019
07:24:59
Tishka17
10.06.2019
07:25:03
ну запусти

Егор
10.06.2019
07:25:20
ну запусти
ну вот его то и надо запускать отдельым процессом

в этом вся проблема

Tishka17
10.06.2019
07:25:26
ну и запускай

Google
Егор
10.06.2019
07:25:29
не будет работать сокетио так

Tishka17
10.06.2019
07:25:33
да почему?

а. ты хочешь emit?

я понятия не имею что делает emit

посылает сообщение?

та кдля оптравки сообщений есть серверы сообщений

Егор
10.06.2019
07:26:10
а. ты хочешь emit?
да. внутри этого стрима делаются emit (отправляет сообщение сокетио на фронт в определенный неймспейс)

Tishka17
10.06.2019
07:26:16
так блин

внутри стрима или внутри фалска?

тогда я не понимаю в чем рпоблема

Егор
10.06.2019
07:26:35
внутри стрима или внутри фалска?
стрим же сам внутри фласка

короче давай проще

не буду упоминать слово стрим

щас покажу

""" Запуск стрима для существующих джоб и для НОВЫХ """ 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)

Dark
10.06.2019
07:26:59
почему zip data.zip /content/data/ создает врхив с пустыми папками content и data? там около 2гб данных во вложенных файлах должно быть

Tishka17
10.06.2019
07:27:10
1. Есть обработчик запросов GET/POST/... 2. Есть вебсокеты. Это две разные вещи и не надо их смешиват в один процесс

Егор
10.06.2019
07:27:11
при запуске фласкоприложения стартует вот этот поток

Tishka17
10.06.2019
07:27:27
зачем тебе переменное число стримов?

Егор
10.06.2019
07:27:33
функцмия watch_events(sid) и есть этот стрим

зачем тебе переменное число стримов?
потому что поисков может быть разное количество

1 стрим == 1 поиск в спланке

Tishka17
10.06.2019
07:27:55
а почему один стрим не может опрашивать несколько поисков?

Страница 9291 из 9768