26 Dec
2014
вот такой тоже ещё вопрос. как сделать трансляцию между например websocket и ssh мне понятно например на python. хоть вручную event driven, хоть Twisted (наверное и gevent, но я его не знаю). чем может быть лучше использование golang с его каналами? или ничем?
что искаропки? работать оно как будет? лучше, хуже?
schors, нормально оно работает. Обычные блокирующие очереди с буферизацией/без. Почти то же самое что mailbox'ы в эрланге/core.async в кложуре. Единственное что мне советовали - это не гонять слишком мелкие куски данных через них, хотя вроде семплы спокойно гоняю.
ничего не понял. я не знаю что такое "обычные блокирующие очереди с буферизацией/без". тем более я не знаю что такое mailboxы в erlnag и core.async даже не знаю что это ;)
в том смысле - работает-то оно как? там треды какие, или что?
schors, каналы это очереди: с одной стороны заталкиваешь данные, с другой забираешь в том же порядке, всё потокобезопасно
на уровне ОС как это реализовано?
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/Сопрограмма
8 Goto 6
т.е. создав в N=количество ядер сопрограмм бесконечные циклы, я всё лочу? или создав мощную обработку (потоковое пережатие видео) всё начинает "чихать"? т.е. следует помнить об этом и избегать?
schors, если ты не дергаешь runtime.Gosched() например после обработки куска данных, то да - лочишь
http://golang.org/pkg/runtime/#Gosched
на обычных сокетах ничего делать не надо, они сами переключаются
о, супер. ты оказал мне неоцинимую услугу. я буду понимать в каком смысле всё это воспринимать. спасибо
кстати пишут, что начиная с 1.2 можно уже не дергать ничего - оно будет само переключаться
а как?
schors, видимо по таймеру, смотрит сколько времени выполнялась горутина и переключает на следующую
а ну кстати или так
типа при компиляции транслятор навставляет?