igoroutine.courses
235 subscribers
17 photos
15 links
igoroutine.courses - The Nature of Programming
Download Telegram
Channel created
Всем привет!
Меня зовут Панасюк Игорь, данный канал посвящен моей школе igoroutine.courses. Здесь будут выходить разные анонсы, интересные задачи и новости.

Подробную информацию обо мне вы можете найти на сайте.

igoroutine_courses
The Nature of Programming
1🔥65👍41
The Nature of Concurrency — курс, который посвящён многопоточному программированию. В курс вложена не только душа, но и знания, которые можно применить в любом языке, поскольку принципы многопоточного программирования везде одинаковы.

Курс преподаётся на языке Go, подробную информацию о нём можно посмотреть на сайте

▶️ Анонс курса на YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥65👍41
Как создавался курс?

В курс вложен весь мой личный опыт, связанный с многопоточным программированием. Помимо этого, во время создания курса я консультировался с ведущими разработчиками индустрии, например, общался с Романом Елизаровым — Ex Project Lead разработки языка Kotlin, человеком, который разрабатывал те самые корутины, также я учился многопоточному программированию у него в университете.

Подробную информацию о курсе можно посмотреть на сайте
18🔥5👍41
🙄🙄 В этом канале еженедельно будут выкладываться различные задачи! Пишите в комментариях, на какие темы вам было бы интересно увидеть посты, например, по Go, System Design или ML
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
🙂 Что будет выведено в stdout?

Version: Go 1.24.1


package main

func main() {
m := make(map[any]any)
insert(m, "IGOROUTINE COURSES")
insert(m, 1)

println(len(m))

}

func insert[T any](m map[any]any, a T) {
type Data struct{}
d := Data{}

m[d] = a
}


P.S. Подсвечено красным, ибо IDE старое
Please open Telegram to view this post
VIEW IN TELEGRAM
😱2
🙂 Что будет выведено в stdout?
Anonymous Quiz
29%
1
37%
2
18%
Compilation error
16%
Panic
😱4
Что будет выведено в stdout?

С точки зрения стандарта языка:

Each type argument is substituted for its corresponding type parameter in the generic declaration. This substitution happens across the entire function or type declaration, including the type parameter list itself and any types in that list.

То есть, тип, объявленный внутри generic-функции insert[T], автоматически захватывает любой T, даже, если сам этот тип не использует T явно.

Таким образом, в
m будут ключи Data[string] и Data[int] и len(m) == 2.

https://go.dev/play/p/Nl250o6wX2X

Но всё немного тоньше. Если написать сигнатуру
func insert[T comparable](m map[any]T, a T), то итоговый ответ будет 1, но почему?

https://go.dev/play/p/EkkuBuwtQJ6

Потому что компилятор попытается вывести тип
T и ему подойдёт только any, следовательно, в m будет всегда один ключ Data[any].

Two instantiated types are identical if they are instantiated from the same generic type and with the same full‑form type argument list.

В таких ситуациях нужно внимательно смотреть за выводом типов

🙄🙄 Ещё больше примеров на курсах
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Кстати, курс The Nature Of Concurrency начинается совсем скоро, нас уже более 20 человек! Не упусти свой шанс стать мастером многопоточного программирования!
17
🙂 Что будет выведено в stdout?
Версия: ARM64 Go compiler 1.24.2


package main

import (
"fmt"
)

type Key struct {
ID int
Callback func()
}

var globalMap = map[any]any{}

func main() {
callback := func() {
fmt.Println("@igoroutine")
}

key1 := Key{
ID: 1,
Callback: callback,
}
key2 := Key{
ID: 1,
Callback: callback,
}

insert[Key](key1)
insert[Key](key2)
fmt.Println(len(globalMap))
}

func insert[T any](key T) {
globalMap[key] = 27
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4🔥32
Что будет выведено в stdout?
Anonymous Quiz
22%
1
31%
2
27%
Ошибка компиляции
19%
panic
😱62🔥2
Что будет выведено в stdout?

С точки зрения стандарта языка:
The comparison operators == and != must be fully defined for operands of the key type; thus the key type must not be a function, map, or slice. If the key type is an interface (то есть any) type, these comparison operators must be defined for the dynamic key values; failure will cause a run-time panic.

В текущем случае тип Key это произведение типов int и func. Поскольку в произведении типов присутствует тип func, то
Key не имеет операторов сравнения != и ==. Поэтому, согласно стандарту, получаем панику:

panic: runtime error: hash of unhashable type main.Key

https://go.dev/play/p/YgAgjKr6Jhp
1🔥741
🙄🙄 Как узнать номер горутины в Go?

Официальная позиция языка такая:

Goroutines do not have names; they are just anonymous workers. They expose no unique identifier, name, or data structure to the programmer. Some people are surprised by this, expecting the go statement to return some item that can be used to access and control the goroutine later.

The fundamental reason goroutines are anonymous is so that the full Go language is available when programming concurrent code. By contrast, the usage patterns that develop when threads and goroutines are named can restrict what a library using them can do.


Однако, иногда бывает нужно получить номер горутины, например, чтобы написать рекурсивный мьютекс, которого в Go нет, в отличие, например, от Java. Совсем недавно писали такой мьютекс на курсе.

Чтобы получить ID горутины, можно использовать stack trace
(Go Playground):


func Get() int64 {
var buf [64]byte
runtime.Stack(buf[:], false)

s := buf[len("goroutine "):]
s = s[:bytes.IndexByte(s, ' ')]

gid, _ := strconv.ParseInt(string(s), 10, 64)

return gid
}


Однако реализация через стектрейс довольно дорогая. Поэтому, более эффективно достать контекст горутины с помощью ассемблера, получив доступ к id:


// func getg() *g
TEXT ·getg(SB),NOSPLIT,$0-8
#ifdef GOARCH_386
MOVL (TLS), AX
MOVL AX, ret+0(FP)
#endif
#ifdef GOARCH_amd64
MOVQ (TLS), AX
MOVQ AX, ret+0(FP)
#endif
#ifdef GOARCH_arm
MOVW g, ret+0(FP)
#endif
#ifdef GOARCH_arm64
MOVD g, ret+0(FP)
#endif
#ifdef GOARCH_s390x
MOVD g, ret+0(FP)
#endif
RET

func Get() int64 {
return getg().goid
}


Более того, на гитхабе есть библиотека, которая поддерживает доступ к goroutineID для версий Go 1.3 и выше.

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

Пишите в комментариях, какие темы осветить в будущих постах!
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥6👍3
Во сколько раз многопоточная реализация сложения матриц 4096 x 1024, распараллеливающая вычисления по строкам на 10 ядрах, быстрее однопоточной реализации?

(90 % кода распараллелено)
Anonymous Quiz
19%
В 3 раза
20%
В 5 раз
13%
В 7 раз
14%
В 9 раз
34%
В 10 раз
3😨6🔥21
🙄🙄 Есть ли смысл в CPU-bound сoncurrency?

Мы все видели таких коллег 😎😎 — только что изучили горутины и сразу решили «распараллелить всё!» Особенно так любят делать новички:

«Оо, я недавно изучил пакет unsafe и concurrency, сейчас распараллелю вычисления в этом запросе и уберу лишние копии».

В лучшем случае код становится менее читаемым.
В худшем — станет медленнее 🫡🫡

Как однажды сказал Дональд Кнут — один из отцов информатики:

«Преждевременная оптимизация — корень всех зол»

Особенно наглядно это работает для CPU-bound задач — например, сложение матриц, хэширование, кодирование. Интуитивно кажется, что «больше горутин = быстрее», но это ловушка.

Закон Амдала отлично иллюстрирует, насколько сложно получить ускорение в этом случае. Например, при 60% параллельного кода разницы между 100 и 1000 ядрами практически нет 💔. В задаче из поста выше ответ по формуле 5.263.

С точки зрения практики, всегда лучше сделать бенчмарк. Как видим, ответ почти сошёлся.


BenchmarkAdd/par/w=1-12 168
BenchmarkAdd/par/w=10-12 776


При этом важно понимать, что с IO-bound задачами всё иначе — там другие принципы и прирост может быть на порядки выше.

Кстати, как раз сегодня на канале вышло видео про устройство атомиков и распараллеливание CPU-bound задач.

Если же хочется разобраться в этих принципах глубже, 25 ноября стартует 2 поток курса The Nature of Concurrency. Это системное погружение в базу многопоточности: от устройства атомиков, мьютексов до модели памяти, устройства race detector'a и lock-free алгоритмов.

Курс закрывает 100% вопросов про Concurrency на собеседованиях, видеоотзывы можно посмотреть на сайте. В честь распродажи 11.11 до конца недели действует скидка на PREMIUM тариф, на нём есть возможность поработать со мной 1 на 1, осталось всего 2 места.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
45🔥3💯1