Pull to refresh
17
Andrew Ka@comercread⁠-⁠only

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

Send message

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

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

Тимлид - медиатор между бизнесом и погромистами. Часто с низкой технической квалификацией, но с гордым званием "глава разработки". Я пришёл к тому, что нужно объединить в себе обе роли. Тим + Тех = Лид. Хочешь сделать хорошо? Сделай это сам.

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

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

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/ (на Хабре уже есть перевод, но настолько корявый даже по сравнению с моими, что лучше смотреть в оригинале).

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. Но. Мопед не мой, а самого Роба Пайка.

Information

Rating
Does not participate
Registered
Activity