вот такой тоже ещё вопрос. как сделать трансляцию между например websocket и ssh мне понятно например на python. хоть вручную event driven, хоть Twisted (наверное и gevent, но я его не знаю). чем может быть лучше использование golang с его каналами? или ничем?
schors, через самые обычные примитивы для блокировки, мьютексы/фьютексы/семафоры(в зависимости от того, что в наличии) ----> http://stackoverflow.com/a/19623095/2442670
так. я попробую перезадать вопрос. у меня собственно непонимание вот где. я открыл 10000 сессий ssh например на прокси на Twisted. у меня там один процесс, который значит бегает и раскидывает по 20000 соединениям туда-сюда в той степени дискретности, какую я реализовал сам. а что происходит в Go? я тоже должен помнить, что операции должны стремиться к атомарным, или там таки треды? но если треды, то не сдохнут ли они на 10000?
schors, в го нет тредов, есть горутины, которые равномерно распределяются в тредпуле по тредам и автоматически переключаются на асинхронных операциях(сокеты в го по-дефолту асинхронные)
вот. это в Go нет тредов. а на уровне ОС горутины - это что?
schors, на уровне ос горутины это сопрограммы выполняющиеся на нескольких тредах
т.е. таки треды. т.е. резкий скачок 1000 соединений это дело не выдержит. не, не, это ни хорошо, ни плохо. такие "скачки" достаточно особенная штука. т.е. если нет специального смысла в мучении с event driven, то Go. так да?
schors, тредов там по-дефолту только ровно сколько ядер у процессора, больше он не создаст
Kerrigan, можешь еще больше ограничить, если так хочется
так стоп. я создал 10000 соединений, которые соединились с другой стороны с 10000 чем-то. это 10000 конкретных функций. они как делят-то всё между собой? варианты - функция равно процесс, функция равно тред, функция выполняет атомарные операции после чего возвращает управление диспетчеру, который вызывает там по своим причинам какую-либо ещё ожидающую функцию - event driven. а тут я чего-то не могу положить ни в одну корзину
schors, функция равно сопрограмма https://ru.wikipedia.org/wiki/Сопрограмма
- ты создал кучу соединений
- соединения стали подключаться
- пока они подключаются - сокет ждет
- пока сопрограмма ждет - можно переключиться на следующую
- все подключились
- ищем среди сопрограмм первые N(число тредов) готовых
- выполняем их до следующего неблокирующего действия(чтение/запись/етц)
8 Goto 6
т.е. создав в N=количество ядер сопрограмм бесконечные циклы, я всё лочу? или создав мощную обработку (потоковое пережатие видео) всё начинает "чихать"? т.е. следует помнить об этом и избегать?
schors, если ты не дергаешь runtime.Gosched() например после обработки куска данных, то да - лочишь
на обычных сокетах ничего делать не надо, они сами переключаются
о, супер. ты оказал мне неоцинимую услугу. я буду понимать в каком смысле всё это воспринимать. спасибо
кстати пишут, что начиная с 1.2 можно уже не дергать ничего - оно будет само переключаться
а как?
типа при компиляции транслятор навставляет?
schors, видимо по таймеру, смотрит сколько времени выполнялась горутина и переключает на следующую
а ну кстати или так