170 похожих чатов

Использовать неблокирующиеся сокеты, работая с ними в рамках одного треда.

Дополнительные треды использовать не допускается. Соответственно, никаких блокирующихся вызовов (кроме вызова селектора) не допускается.

С такой формулировкой как думаете можно использовать горутины для хэндла tcp запросов?

28 ответов

24 просмотра
Дурачок-Глупый Автор вопроса

for { conn, err := listener.Accept() go handleConnection(conn) } Имею ли я право с таким тз писать так или надо как-то по другому? Если по другому то как

в рамках одного треда? GOMAXPROCS=1

Дурачок-Глупый Автор вопроса
Дурачок Глупый
for { conn, err := listener.Accept() go ha...

мб в go есть условный poll? select вроде похож, но как будто он не подходит

Дурачок Глупый
мб в go есть условный poll? select вроде похож, но...

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

Дурачок Глупый
for { conn, err := listener.Accept() go ha...

В принципе можно, но под ДоС'ом оно ляжет по out of memory. Я б поизвращался и сделал, например, канал коннектов, из которых читает заранее известное (или изменяющееся в заданных пределах) количество рутин

Alexey ilving
В принципе можно, но под ДоС'ом оно ляжет по out o...

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

Дурачок-Глупый Автор вопроса
Дурачок Глупый
мб в go есть условный poll? select вроде похож, но...

увидел вроде есть poll в постгресе Может он мне подойдет? Делать accept, класть и слушать файловые дескрипторы?

Дурачок Глупый
увидел вроде есть poll в постгресе Может он мне по...

Это какое-то тестовое задание? Если да, то go там явно не подразумевался в качестве языка, на котором будет решение. Потому что почти всегда хватает горутины на соединение. Не хватает, если соединений планируется ну очень много, порядка миллиона. Вот там да, нужно думать над неблокирующим вводом-выводом (для чего есть специальные библиотеки)

Владимир Столяров
Это какое-то тестовое задание? Если да, то go там ...

это немножечко чушь мы все читали ту мейлрушную статью, но не все внимательно, видимо если у вас много (1М+) соединений, и на них ничего не происходит большую часть времени - вы можете что-то наэкономить, сократив количество горутин но если у вас там трафик - горутин придется держать столько, сколько и соединений, потому что чудес не бывает

Дурачок-Глупый Автор вопроса

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

Дурачок-Глупый Автор вопроса
Roman F
Морально попадает

а как морально починить?

Дурачок Глупый
а как морально починить?

go, так-то, сразу запускает дополнительные треды, больше одного go запускает дополнительные треды для блокирующих сисколов так что - никак

Дурачок-Глупый Автор вопроса

тут вопрос можно ли считать файберы тредами?

Daniel Podolsky
это немножечко чушь мы все читали ту мейлрушную с...

А как они там предлагают экономить? Явно создавать сетевой стек, начиная с еполла, а не использовать встроенный?

Daniel Podolsky
о каких файберах речь?

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

Дурачок-Глупый Автор вопроса
Павλо 🇺🇦
полл, кстати, так же болеет проблемой 10к

а у него под капотом системный вызов poll?

Дурачок-Глупый Автор вопроса
Павλо 🇺🇦
у кого?

у гошного полла

Дурачок Глупый
у гошного полла

если они не намудрили с неймингом, то теоретически - да

Евгений Омельченко
А как они там предлагают экономить? Явно создавать...

ага и по событиям на epoll запускать горутину для обработки

Daniel Podolsky
это немножечко чушь мы все читали ту мейлрушную с...

это ограничение гошного поллера, пока сокет ожидает ивентов от поллера - его буфер чтения простаивает, ожидают миллион сокетов - миллион буферов простаивают. хотя одновременно прилетят не больше сотни-тысячи ивентов, можно было бы использовать меньшее количество буферов. я как-то на это оптимизировал чтение, но потом в рантайм добавили поддержку splice на копирование из сокета в сокет без буферов в юзерспейсе и это решило эти проблемы

Евгений Омельченко
А как они там предлагают экономить? Явно создавать...

китайцы жгут в этом направлении https://github.com/panjf2000/gnet

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
4
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта