Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
// SafeCounter is safe to use concurrently.
type SafeCounter struct {
v map[string]int
sync.Mutex
}
// Inc increments the counter for the given key.
func (c *SafeCounter) Inc(key string) {
c.Lock()
c.v[key]++
c.Unlock()
}
// Value returns the current value of the counter for the given key.
func (c *SafeCounter) Value(key string) int {
c.Lock()
defer c.Unlock()
return c.v[key]
}Но такой планировщик реализован в проекте vibe.d
The race detector only finds races that happen at runtime, so it can't find races in code paths that are not executed. If your tests have incomplete coverage, you may find more races by running a binary built with -race under a realistic workload.Так себе костыль. Статические проверки надёжнее.
Выше уже написали, что планировщики не эквивалентны друг другу.Они не идентичны, но в данных примерах они действуют эквивалентно — раскидывают волокна по ограниченному набору нитей.
Кстати, а в какой миг viber.d решает, что пора переключиться на другой fiber внутри системного потока?Когда вызывается функция yield, переключающая контексты.
Количество системных потоков можно задавать из программы?Разумеется.
for {
select {
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Print(".");
runtime.Gosched();
}
}На сколько я знаю Go может переключить на другую горутину в любой момент
Ещё одна разница, горутины сами разливаются по потокам (и ядрам) в отличие от файберов в DLang.Задачи в vibe.d работают аналогично.
Dlang можно лучше затюнить, но больше кода.Во всех примерах эквивалентного кода на D получилось меньше.
А тут говорят обратное.
Задачи в vibe.d работают аналогично.
Дата публикации статьи — 11 апреля 2012Приведите статью по свежее, пожалуйста :-)
Огласите список популярных проектов на vibe.d, желательно с публикациями. Хотя бы уровня того самого криковатого фронтенда.Опять писькомерство. Ну, вот, например: www.sociomantic.com
Ну, вот, например: www.sociomantic.com
Приведите статью по свежее, пожалуйста :-)
Согласен с тем, что в этом есть доля писькомерства, но все таки большое количество разнообразных популярных проектов для языка, который появился не так давно — показатель его практичности
А вот кто финансирует разработку всяких Gogs и CockroachDB?
Очевидно, корпорация добра не плохо вложилась в продвижение языка. С тем же успехом она могла бы популяризировать любой примитивный язык. Basic, например, или JavaScript.
сколько успешных проектов на JS
Социомантик как раз и запилил свою распределённую базу.
Пока горутина не разрешит — никто её с нити не снимет.Хз, я поверял так: делал лимит на 1 поток, и запускал не прерывный бесконечный цикл, и при этом соседние горутины отрабатывали.
Ну, вот, например: www.sociomantic.com
Всё интересует, может серию статей?
волокна D выполняются параллельно, в Go — конкурентно
Fiber.yield().Что будет если файбер повис. Поток тоже повиснет?
Как вообще очередь устроена
Но такой планировщик реализован в проекте vibe.d, правда синтаксис запуска параллельного потока всё ещё не столь лаконичен как в Go
Однако, эквивалентный функционал реализуется не особо сложнее ручной реализацией цикла наблюдения.
Совсем не такой, от слова совсем.
Для начала надо реализовать такую мелочь как динамический расширяемый стек, иначе весь смысл файберов вообще теряется.Копировать стек при переполнении — не самая светлая идея на мой взгляд. А позволять смертельно зациклившейся в рекурсии программе отъедать до 250 мегабайт памяти под стек — вообще какая-то дичь.
В особенности это касается сетевого I/O, которое, по сути, с планировщиком одно целое.vibe.d использует асинхронный I/O. Но стандартная библиотека, да, использует синхронный.
Select может ждать на любом количестве каналов, не будет жрать процессор или требовать использовать костыли в виде Sleep или условных переменных.Да нет, ожидание нескольких каналов в Go реализуется так же бесконечным циклом: play.golang.org/p/fodHZpVaci
На подумать — конкурентность Go ни капли не страдает даже в условиях, когда всего один worker thread.В D она тоже не страдает :-)
receive(
(int val) {
},
(double val) {
},
(int i, double d) {
},
(MyStruct s) {
}
);tid.send(42);
tid.send(3.14);
tid.send(10, 10.0);
tid.send(MyStruct(args));auto quit = false;
for( !quit ){
receive(
(int val) {
},
(Quit q) {
quit = true;
}
);
}Authenticated connections are supported by using a URL connection string such as «mongodb://user:password@host». Note that the driver currently only supports the «MongoDB-CR» authentication mechanism. Since new MongoDB versions, starting with 3.0, default to the new «SCRAM-SHA-1» method, it is necessary to manually switch to the old method. See
stackoverflow.com/questions/29006887/mongodb-cr-authentication-failed for more information.
Но решив написать на D, я рискую не найти либы для какого-нибудь специфичного протокола
При этом не вижу серьезных причин, почему качество репозиториев на D должно быть лучше.
везде можно использовать C, C++,
Неизвестно насколько они дешевы.
Могу ли я вместо использования паттерна Worker'ов использовать порождение корутин?
Кстати, есть ли в D какая-то замена кросс-компиляции?
Да и вообще есть ли большие проекты на D?
Обобщенный код — это, конечно, удобно, но как показала практика не необходимо.Все так говорят, пока проект не погряз в копипасте.
А есть ли большие проекты на Go?
Все так говорят, пока проект не погряз в копипасте.
Давайте потестим, выбирайте поле для битвы :-)
docker-compose up.
man!( Go => D ).concurrency