Size: a a a

2021 March 18

s

suhr in rust_offtopic
Учитывая, что в го есть горутины и планировщик, как там мутексы работают?
источник

AN

Alex Noname in rust_offtopic
Мимо Проходящий
ну к этому сводится работа системного шедулера, но это же очень и очень плохо
а как эту задачу решить хорошо? я сказал что первое в голову пришло.
источник

МП

Мимо Проходящий... in rust_offtopic
может кто-то не в курсе (это нормально), но взять тред из асинхронного пула и назначить таске - это дорого, это переключение контекста ядра, беда беда
источник

МП

Мимо Проходящий... in rust_offtopic
suhr
Учитывая, что в го есть горутины и планировщик, как там мутексы работают?
если на пальцах - там шедулер запускает N тредов, где N - число физических ядер, затем берёт из очереди инструкции горутин, и раскидывает по этим тредам (нюансы - при зависании горутины на IO создаётся новый тред, по окончании IO удаляется) при блокировке мьютексом шедулер просто не выполняет инструкции залоченной горутины, конкуренции системных тредов за мьютекс нет
источник

s

suhr in rust_offtopic
Ну и чем это отличается от рантайма, который раскидывает такси по тредам?
источник

МП

Мимо Проходящий... in rust_offtopic
Alex Noname
а как эту задачу решить хорошо? я сказал что первое в голову пришло.
Взаимодействующие последовательные процессы в голанге, различные решения с акторами (это работает, но это дико сложно в сравнении с голангом), агенты в эрлэнге
источник

МП

Мимо Проходящий... in rust_offtopic
suhr
Ну и чем это отличается от рантайма, который раскидывает такси по тредам?
я написал чем отличается - тредов в целом фиксированное количество по числу ядер, а не из пула они берутся
источник

AN

Alex Noname in rust_offtopic
я ничо не понял. насколько умный рантайм зависит от рантайма. в чем проблема?
источник

s

suhr in rust_offtopic
> шедулер запускает N тредов
Check.
> берёт из очереди инструкции горутин, и раскидывает по этим тредам
Берём футуры и раскидываем по тредам. Check.
> нюансы - при зависании горутины на IO создаётся новый тред, по окончании IO удаляется
NOT check
> при блокировке мьютексом шедулер просто не выполняет инструкции залоченной горутины
Check, await возвращает управление планировщику.
источник

МП

Мимо Проходящий... in rust_offtopic
suhr
> шедулер запускает N тредов
Check.
> берёт из очереди инструкции горутин, и раскидывает по этим тредам
Берём футуры и раскидываем по тредам. Check.
> нюансы - при зависании горутины на IO создаётся новый тред, по окончании IO удаляется
NOT check
> при блокировке мьютексом шедулер просто не выполняет инструкции залоченной горутины
Check, await возвращает управление планировщику.
что значит Check и что ты этим хотел показать?
источник

s

suhr in rust_offtopic
Сравниваю гошный подход с async/await. Правда, с растовым токио, так как шарп не знаю.
источник

МП

Мимо Проходящий... in rust_offtopic
плохо сравниваешь.
начни с того, что ни какого шедулера в дотнэте нет. Есть пул тредов, из которого можно взять тред и положить обратно.
источник

s

suhr in rust_offtopic
Документация говорит, что он есть, но я шарп не знаю, так что обсуждать не готов.
источник

AN

Alex Noname in rust_offtopic
что значит нету шедулера. Если таксков больше чем тредов - то что делать?
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Мимо Проходящий
100 тасок запущенны одновременно и все кроме одной ждут, пока выполнится myLock.Release();
когда в таске доходит до await myLock.WaitAsync(); я хз что именно конкретно происходит, но ничего хорошего точно.
1) либо таска останавливается, её тред уходит назад в пул, планировщик переключается на другую таску, которая получает тред из пула - чтобы тут же вернуть его назад, поскольку блокировка не снята и т.д.
2) либо просто тред, в котором работала таска, дерётся за myLock, что логичнее, а другие таски при этом получают новый тред из пула и делают то же самое
и то и то плохо, других вариантов я не вижу
ну вроде первого, только с чего бы таска вторая сразу возвращает назад? Если она не разбужена то она так и ждет дальше
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Мимо Проходящий
если на пальцах - там шедулер запускает N тредов, где N - число физических ядер, затем берёт из очереди инструкции горутин, и раскидывает по этим тредам (нюансы - при зависании горутины на IO создаётся новый тред, по окончании IO удаляется) при блокировке мьютексом шедулер просто не выполняет инструкции залоченной горутины, конкуренции системных тредов за мьютекс нет
ну это то что тут просходит
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
модуло нейминг "горутина-таска"
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Мимо Проходящий
плохо сравниваешь.
начни с того, что ни какого шедулера в дотнэте нет. Есть пул тредов, из которого можно взять тред и положить обратно.
есть шедулер конечно, SyncronizationContext Называется
источник

МП

Мимо Проходящий... in rust_offtopic
Αλεχ Zhukovsky
есть шедулер конечно, SyncronizationContext Называется
это такая штука, которая на await рулит таски. Она берёт таску и выдаёт ей тред грубо говоря, правильно? При этом контекст ядра переключается на таску. Если тредов в пуле не хватает, создаётся новый тред, который по окончании таски (или на очередной await) возвращается в пул
источник

МП

Мимо Проходящий... in rust_offtopic
Αλεχ Zhukovsky
ну вроде первого, только с чего бы таска вторая сразу возвращает назад? Если она не разбужена то она так и ждет дальше
> с чего бы таска вторая сразу возвращает назад?

я не знаю, может быть она и не возвращает. Но в этом случае тред просто заблокирован и ждёт снятия лока, установленного  при выполнении самой первой таски. То есть 100 тредов дерутся за мутекс, классика жанра
источник