Обновить
16K+
16
Andrew Ka@comerc

#кодеротбога

3
Рейтинг
117
Подписчики
Отправить сообщение

Зацените, как надо устраиваться на работу. Хакеры, чо. ?

Спасибо! Исправил:

package main

import (
	"fmt"
	"sync"
)

type Counter struct {
	data  chan int
	total chan int
}

func NewCounter() *Counter {
	data := make(chan int)
	total := make(chan int)
	c := Counter{data, total}
	go func() {
		var count int
		for {
			select {
			case increment := <-data:
				count += increment
			case total <- count:
			}
		}
	}()
	return &c
}

func (c *Counter) Add(v int) {
	c.data <- v
}

func (c *Counter) Total() int {
	return <-c.total
}

func main() {
	counter := NewCounter()
	var wg sync.WaitGroup
	wg.Add(1000000)
	for i := 0; i < 1000000; i++ {
		go func() {
			counter.Add(1)
			wg.Done()
		}()
	}
	wg.Wait()
	fmt.Println(counter.Total())
}

package main

import "sync"

type Counter struct {
	data  chan int
	total int
}

func NewCounter() *Counter {
	data := make(chan int)
	c := Counter{data, 0}
	go func() {
		for {
			increment := <-data
			c.total += increment
		}
	}()
	return &c
}

func (c Counter) Add() {
	c.data <- 1
}

func main() {
	counter := NewCounter()
	var wg sync.WaitGroup
	wg.Add(1000000)
	for i := 0; i < 1000000; i++ {
		go func() {
			counter.Add()
			wg.Done()
		}()
	}
	wg.Wait()
	println(counter.total)
}

Внутри канала тоже mutex, кстати.

Говорить что в Go нет lock-free структур данных и топить за mutex это значит полностью не понимать CSP и идиомы Go связанные с многопотоком. Ещё раз: гуглим go proverbs, читаем первую. Там будет "Don't communicate by sharing memory, share memory by communicating".

Задача: Реализовать структуру-счетчик, которая будет инкрементироваться в конкурентной среде. По завершению программа должна выводить итоговое значение счетчика.

Условие: Решение без применения примитивов из пакета sync, исключительно используя канал для обеспечения потокобезопасной передачи/приёма данных.

Пытаюсь научиться лучшим практикам - никак. Помогите!

А где бы взять инструкцию, как правильно заполнять Green Card?

Поправил на "аджайлистов". Мне очень нравится идея притянуть это всё к BDD. https://eventmodeling.org/posts/what-is-event-modeling/ (на Хабре уже есть перевод, но настолько корявый даже по сравнению с моими, что лучше смотреть в оригинале).

А вы готовите BDD?

filepath.Walk(".", visit) применяет такое же решение:

func visit(p string, info os.FileInfo, err error) error {

if err != nil { return err }

fmt.Println(" ", p, info.IsDir())

return nil

}

В мамбе такое было 15 лет назад.

Вы отказались от Nakama в Balancy?

очепятка на картинке с красными и синими квадратиками. в правом верхнем углу должен быть "Event Storming" а не "Event Sourcing", см. оригинал: https://threedots.tech/post/software-dark-ages/system-thinking-solved.jpg

Я узнал, что автор Unix Way - Кен Томпсон; так же соавтор C и трудится над Go в Google в свои 80 лет (это почему книжки про C++).

Так и было! Ловил deadlock. Но. Мопед не мой, а самого Роба Пайка.

Вот я и трахался полдня, разруливая конкурентность и параллелизм, т.к. DeepL тоже переводит concurrency, как параллелизм.

Это вполне устоявшийся термин. Можно погуглить, ну или спросить у ChatGPT:

Concurrency (конкурентность) в программировании обозначает выполнение нескольких задач одновременно. В языке Go (Golang) конкурентность достигается с помощью горутин (goroutines) - легковесных потоков выполнения. Горутины позволяют выполнять разные задачи параллельно, без необходимости явного управления потоками.

Информация

В рейтинге
1 385-й
Зарегистрирован
Активность