
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 ядром

Alex
10.06.2019
07:12:05

Google

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

Tishka17
10.06.2019
07:12:30

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

Alex
10.06.2019
07:12:33


Tishka17
10.06.2019
07:12:37
да откуда тут нагрузка?
Господа, такой вопро.
Надо поднять сервер, что бы он отдавал пару файлов.
Сделал на 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 файла, а потом вырубить сервак, т.е. надо отловить ГЕТ-запрос определённый и выключить сервер.
а почему нельзя было взять nginx?


Егор
10.06.2019
07:13:12
ну я не особо силен в запуске нескольких воркеров для фласка

Alex
10.06.2019
07:13:30

Tishka17
10.06.2019
07:13:40

Alex
10.06.2019
07:13:40

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

Google

Tishka17
10.06.2019
07:14:00

Alex
10.06.2019
07:14:08
“поднимать nginx"
охренеть как сложно

Егор
10.06.2019
07:14:43

Tishka17
10.06.2019
07:14:48

user753
10.06.2019
07:14:48


Tishka17
10.06.2019
07:15:20
Господа, такой вопро.
Надо поднять сервер, что бы он отдавал пару файлов.
Сделал на 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 файла, а потом вырубить сервак, т.е. надо отловить ГЕТ-запрос определённый и выключить сервер.
не надо open и read. Юзай хотя бы send_file


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

Alex
10.06.2019
07:15:40

Tishka17
10.06.2019
07:15:58

Alex
10.06.2019
07:16:20

user753
10.06.2019
07:16:20

Tishka17
10.06.2019
07:16:21

Alex
10.06.2019
07:16:31

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?

Tishka17
10.06.2019
07:18:11

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

user753
10.06.2019
07:19:38

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.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 или связываться с конкретными клиентом.
да не ломает мультипроцессинг вебсокеты. Вебсокет должен обрабатываться одним процессом

Егор
10.06.2019
07:24:14
то есть отдельный сервис решающий 1 задачу)

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
а почему один стрим не может опрашивать несколько поисков?