Go : параллельное выполнение

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 09 фев 2024, 02:37

Olej писал(а):
09 фев 2024, 02:03
То, что гораздо интереснее
Иногда в обсуждениях обсуждают так:
"... а почему так сложно? Не проще ли через привычные API синхронизации: мютексы и т.п. - из пакета sync".
Я задавался себе таким вопросом ... и знаю сейчас на него ответ:
- классические API синхронизации, известные ещё из POSIX API (C API, C++ API) - это всё низкоуровневые механизмы...
- при чуть более-менее сложных параллелизмах в множестве этих низкоуровневых механизмов возникнет путаница и архитектурные ошибки
...
- об этом говорили не раз классики - это ещё с 80-х-90-х, тот же Хоар и др., и предлагали другие высокоуровневые механизмы ... те же мониторы Хоара...
- но "практикам" (а на самом деле халявщикам) им было некогда, они к этим выводам не прислушивались, им нужно было "продакшн код гнать" :twisted:
- а каналы и обмен сообщениями Go - это и есть те высокоуровневые механизмы Хоара...
- только теперь их применение требует новой техники написания (все эти context, errgroup, ... и еже с ними) ... и по-новому вывернутых мозгов.

P.S. ... и как-раз механизм модулей Go (Go: модули) позволяет создавать разные модели, на равных, разным группам разработчиков, размещая свои проекты-модули в сетевых репозиториях.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 09 фев 2024, 03:59

Olej писал(а):
09 фев 2024, 02:03
- ожидание нажатия клавиши на клавиатуре ... для того чтобы это был неблокирующий ввод - это отдельная горутина...
Вот это место интересное ... очень часто в Интернет вопрос (например у тех кто интересуется играми): как сделать неблокирующий ввод с клавиатуры :?:
Традиционно в UNIX/POSIX API есть 2 режима ввода с клавиатуры:
1). канонический: построчный (заканчивая Enter), блокирующий, есть эхо-отобржение ввода на терминал, обрабатываются спецсимволы, например Backspase, стрелки перемещения и т.д.
2). неканонический: посимвольный, неблокирующий, без эхо-отображения, никаких спецсимволов.
Но :!:
Это: платформенно-зависимое решение - POSIX / UNIX / Linux
А в параллельном (конкурентном) исполнении неблокирующий ввод может быть реализован в отдельной ветке, горутине циклически опрашивающей ввод :!: Подобно тому как это сделано в примере выше.
И если пройтись по репозиториям GoLang поиском с контекстом "keyboard" - вот: https://pkg.go.dev/search?q=keyboard&m= - то вы получите несколько десятков модулей для чтения клавиатуры ... от 2012 до 2024 года:
keyboard (github.com/eiannone/keyboard)
Imported by 216 | v0.0.0-...-0d22619 published on Jun 11, 2022 | MIT
keyboard (atomicgo.dev/keyboard)

keyboard (atomicgo.dev/keyboard)
Package keyboard can be used to read key presses from the keyboard, while in a terminal application.
Imported by 98 | v0.2.9 published on Jan 10, 2023 | MIT

inpututil (github.com/hajimehoshi/ebiten/v2/inpututil)
Package inpututil provides utility functions of input like keyboard or mouse.
Imported by 438 | v2.6.5 published on Jan 27, 2024 | Apache-2.0

key (golang.org/x/mobile/event/key)
Package key defines an event for physical keyboard keys.
Imported by 209 | v0.0.0-...-c713f31 published on Jan 12, 2024 | BSD-3-Clause

keyboard (github.com/mum4k/termdash/keyboard)
Package keyboard defines well known keyboard keys and shortcuts.
Imported by 37 | v0.19.0 published on Jan 29, 2024 | Apache-2.0

kb (github.com/chromedp/chromedp/kb)
Package kb provides keyboard mappings for Chrome DOM Keys for use with input events.
Imported by 51 | v0.9.5 published on 3 days ago | MIT

keyboard (gobot.io/x/gobot/v2/platforms/keyboard)
Package keyboard contains the Gobot drivers for keyboard support.
Imported by 0 | v2.3.0 published on Jan 7, 2024 | Apache-2.0

keylogger (github.com/MarinX/keylogger)
Package keylogger is a go library for linux to capture keyboard events.
Imported by 24 | v0.0.0-...-a54d783 published on May 28, 2021 | MIT

terminput (github.com/tj/go-terminput)
Package terminput provides terminal keyboard input for interactive command-line tools.
Imported by 25 | v1.0.0 published on Nov 10, 2019 | MIT

keyboard (azul3d.org/engine/keyboard)
Package keyboard implements various keyboard related data types.
Imported by 19 | v0.0.0-...-793ea6c published on Oct 24, 2021 | BSD-3-Clause

keyboard (github.com/omustardo/gome/input/keyboard)
keyboard handles keyboard interaction with a glfw window.
Imported by 10 | v0.0.0-...-1050381 published on May 7, 2017 | MIT

key (github.com/goki/gi/oswin/key)
Package key defines an event for physical keyboard keys, for the GoGi GUI system.
Imported by 11 | v1.3.25 published on Oct 24, 2023 | BSD-3-Clause

key (goki.dev/goosi/events/key)
Package key defines an event for physical keyboard keys, for the GoGi GUI system.
Imported by 10 | v0.0.25 published on Dec 26, 2023 | BSD-3-Clause

keyboard (github.com/Pauloo27/keyboard)
Imported by 3 | v0.0.0-...-2640675 published on May 15, 2021 | MIT

keyboard (github.com/moutend/go-hook/pkg/keyboard)
Package keyboard provides low level hook for keyboard input.
Imported by 3 | v0.1.0 published on May 5, 2020 | MIT

kindleland (github.com/jim/kindleland)
Imported by 6 | v0.0.0-...-79f10e7 published on Mar 5, 2019 | AGPL-3.0

xel (github.com/amortaza/go-xel)
Imported by 12 | v0.0.0-...-37a8052 published on Sep 5, 2020 | MIT

keyboard (github.com/pwaller/keyboard)
Keyboard offers a universal keyboard shortcut binding interface for various backends.
Imported by 3 | v0.0.0-...-f32bd76 published on Oct 11, 2012 | BSD-1-Clause

p5 (github.com/go-p5/p5)
Package p5 provides types and functions to draw geometrical shapes on a canvas, interact with the mouse and keyboard, with the aim to learn programming with a graphics aid.
Imported by 4 | v0.14.0 published on Jan 2, 2024 | BSD-3-Clause

input (git.tebibyte.media/tomo/tomo/input)
Package input defines keyboard and mouse code constants.
Imported by 4 | v0.29.0 published on Sep 9, 2023 | GPL-3.0

keyboard (github.com/vendelin8/keyboard)
Imported by 1 | v0.0.0-...-fd5dc20 published on Apr 18, 2023 | MIT

keypress (github.com/gcla/gowid/widgets/keypress)
Package keypress provides a widget which responds to keyboard input.
Imported by 3 | v1.4.0 published on Jul 9, 2022 | MIT

keyboard (github.com/sago35/tinygo-keyboard)
Imported by 1 | v0.0.0-...-732c234 published on 2 days ago | MIT

keyboard (github.com/gowebapi/webapi/device/keyboard)
Package keyboard contains keybaord layout and ability to capture keys that are normally reserved by the underlying host operating system.
Imported by 1 | v0.0.0-...-41cedfc published on Dec 21, 2022 | BSD-3-Clause

getch (github.com/zetamatta/go-getch)
Imported by 5 | v0.0.0-...-31a2298 published on Dec 23, 2018 | BSD-3-Clause

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 09 фев 2024, 05:18

Olej писал(а):
09 фев 2024, 03:59
А в параллельном (конкурентном) исполнении неблокирующий ввод может быть реализован в отдельной ветке, горутине циклически опрашивающей ввод
А поскольку это важно и спрашивают, то пример:

Код: Выделить всё

package main

import (
    "github.com/eiannone/keyboard"
    "fmt"
)

func main() {
    keyboard.Open()
    defer keyboard.Close()
    chChan := make(chan rune)        // канал ввода с клавиатуры
    go func(chChan chan <- rune) {   // горутина ввода клавиши
        for {
            ch, _, _ := keyboard.GetKey()
            chChan <- ch
        }
    }(chChan)

    for {
        ch := <- chChan              // вводимые символы
        if ch == 0 { break }
        fmt.Printf("<%s>%03x ", string(ch), ch)
    }
    println()
}
Тут важно то, что спецсимволы (^C, ^D) не обрабатывабтся, а нужно как-то предусматривать завершение!
И если завершение сделать по командам kill/killall, т.е. без выполнения завершающего приложение keyboard.Close(), то терминал ваш перейдёт в неканонический режим ввода, и прийдёт в негодность :!: :cry:
Нужно кодом "ловить" символы завершения. Но в данном простом случае - это все спецсимволы, не имеющие ... rune-эквивалента?: ^C, ^D, Enter, ... и пробел :-o
И выглядит это так:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.2/examples.work/goproc/errgrp$ go run keyb.go 
<q>071 <w>077 <e>065 <r>072 <t>074 <y>079 <й>439 <ц>446 <у>443 <к>43a <е>435 <н>43d <1>031 <2>032 <3>033 
Вложения
keyb.go
(588 байт) 6 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 11 фев 2024, 11:14

Olej писал(а):
08 фев 2024, 14:11
Разбираемся с пакетом Context в Golang
Только я начал детально ковырять Context (08.02), как тут же появляется публикация + ссылки на неё по Telegram :lol: - Context Control in Go
Best practices for handling context plumbing.
Published: 2024-02-03

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 27 фев 2024, 17:11

Ещё одна задача ... уже становится классикой: майнинг!
К вопросу того как (грубо) организовано:
- поиск очередного блока в любой криптовалюте...
- майнинг IPv6 адресов: майнинг IPv6 для сети Yggdrasil
- альтернативная DNS система EmerDNS: альтернативный DNS EmerCoin, OpenNIC DNS и EmerCoin
- альтернативная DNS система альтернативный DNS Alfis

Блокчейн. Руководство для начинающих разработчиков.
Блокчейн. Руководство для начинающих разработчиков
Авторы: Б. Сингхал, Г. Дамеджа, П.С. Панда
Бикрамадитья Сингхал, Гаутам Дамеджа, Панда Приянсу Сехар
Блокчейн. Руководство для начинающих разработчиков
ISBN: 978-5-9775-4052-0
288 страниц
август 2019
BHV С-Петербург

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 27 фев 2024, 20:20

Olej писал(а):
27 фев 2024, 17:11
майнинг!

Код: Выделить всё

package main

import (
	"crypto/sha512"
	"flag"
	"fmt"
	"encoding/binary"
	"time"
   "sync/atomic"
)

const	Size512 = 64 // Size is the size, in bytes, of a SHA-512 checksum.

type mesage struct {
	solt uint32
	hash [Size512] byte
}	

func (m mesage) String() string { // формат вывода
	s := fmt.Sprintf("%07d | ", m.solt)
	for _, b:= range(m.hash) {
		s += fmt.Sprintf("%02X", b)
	}
	return s
}

func (m1 mesage) less(m2 mesage) bool {
	for i := 0; i < Size512; i++ {
		if m2.hash[i] < m1.hash[i] { return true  }
		if m2.hash[i] > m1.hash[i] { return false }
	}
	return true 
} 

var (	branch int     // число горутин
	  	size int       // размер блока
		limit uint )

func main() {
	exemplar := make(chan mesage, 30) // канал результата
	var count uint32 = ^uint32(0)     // -1
	var finish uint32 = 0
	fmt.Printf("горутин %d; размер блока %d\n", branch, size)
	data := make([]byte, size)	
	for i, _:= range(data) { 		
		data[i] = byte(i % 256)
	}
		
	for _= range branch {
	   go func(ch chan mesage) {        // горутина хеш-функции
			var m mesage
	 		for {
				m.solt =	atomic.AddUint32(&count, 1)
				if m.solt > uint32(limit) { break }
				binary.LittleEndian.PutUint32(data, m.solt) // 4 байта блока
				m.hash = sha512.Sum512(data)
				ch <- m
			}
			if atomic.AddUint32(&finish, 1) == uint32(branch) {
				close(ch)
			}
		}(exemplar)
	}

	tmStart := time.Now()
	dur := func() time.Duration {       // временная метка задержки
		return time.Now().Sub(tmStart)
	}
	first := true
	var m2 mesage
	for m1 := range exemplar {          // получить данные из канала
		if first {
			m2 = m1
			first = false
		}			
		if m2.less(m1) {
			fmt.Printf("% 14v : %s\n", dur(), m1)
			m2 = m1
		}
	}
	fmt.Printf("% 14v : завершение опроса\n", dur())
}

func init() {
	flag.IntVar(&branch, "g", 1, "число горутин")
	flag.IntVar(&size,   "b", 1000, "размер блока")
	flag.UintVar(&limit, "v", 32767, "лимит поиска")
	flag.Parse()
}
Вложения
mining.go
(2.01 КБ) 5 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 27 фев 2024, 20:22

Olej писал(а):
27 фев 2024, 20:20
майнинг!

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -h
Usage of ./mining:
  -b int
        размер блока (default 1000)
  -g int
        число горутин (default 1)
  -v uint
        лимит поиска (default 32767)

Код: Выделить всё

   
olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining --help
Usage of ./mining:
  -b int
        размер блока (default 1000)
  -g int
        число горутин (default 1)
  -v uint
        лимит поиска (default 32767)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 27 фев 2024, 20:25

Olej писал(а):
27 фев 2024, 20:22
майнинг!

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 
горутин 1; размер блока 8000
     184.574µs : 0000000 | 29516625AB81DCBDC359B0D0767FCE4CA9068D94265263BD1A97901DD698DF1AAA9D89D3291ACBE6D526F6F9C77F00AA6EC5EEB794AD21B5A66329BE901FDA07
     311.082µs : 0000001 | 1630B8A0062DF2282D00EC3083748DC7E32636A218A73BE8C549C794B282585E13CCC11D86398202E0B90248A490BDA339381E2FD890193B3E90A1FE5C3D0A46
     356.085µs : 0000002 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0B488A51FB7523D1FB9F81500A584F1A821366096C373ADB11D1A303CE783BE26D9BB512A4DC101AD4E5AF8
     1.07185ms : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63BE3B6E5E847DBBED9F0F803415365455B58D0E98A1E9397360602A71331D6CA48290E3A423A7640B8286CB
    2.211976ms : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA3532043A331B78B190EDE7A5A0F5FE710B924F924C63D821350A642F2FAF97C9B808B973DF4599F2940514CA2
    47.68598ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D27BB8366DBA3D65776F8D5306A58443276A9C1A9EB1290C6F044BED35A05BA9277720EA6747035E7527607
   53.340078ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C37440DFC0D9173822DAC758679E2BBC938BD66DF4564A34A13C5CE0191D91B7CA0C35FAA62674E7E73FE18A171
  276.104324ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C14D43B5958861D279DED74A4D7CE41DC777BB227804891E86C4090892DF37145D95CF13F8FEBF1E4A2AE0B
  362.074206ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D145D7F71CF9CA61B3B0B96D8D273DF9EBB8B5B60D0CE73214F8FD7F958E93D51CA68992F0C9D790B44772A
  443.212999ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E09013D14E2A97834293613D499EEA95F7BB7687119DE858B2A0C9921069B5BF68ECC3FF4FB1CD0966065AB
  498.425434ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59DB78E99924438C381D13A45557F932DF1ED0B70CDC240C950815AC7D708F9413A7962B60140B4DE40893D2B
  1.078128748s : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC39FE5F40EB8AE1D2CA1B78A83ABBE73DA136628BB51081FC3BCAC33A852F12A041D3DBE04128EB6B295E8A4
   1.31042615s : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D09383665B2114E89FADD1F4FFC0995BFE50DF53DD013DD35CBAA94E2445064F7D02D7D29B515E58FE8F08EDC1348
  2.155714174s : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4CB15D7B2508882725BDDFAEE520A9EAC208AC567DF204AD19C6F6CE6670F5EF47BBB19D8390B22A53C96AF9
  3.944751798s : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA3859C88C258C1AC521A9001475E285CB5D2150DB90B690CA3C42829A6D55D1524DE8F8ED3FDD10CCD46387
 33.741734719s : завершение опроса
5 горутин:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -g=5
горутин 5; размер блока 8000
     604.581µs : 0000001 | 1630B8A0062DF2282D00EC3083748DC7E32636A218A73BE8C549C794B282585E13CCC11D86398202E0B90248A490BDA339381E2FD890193B3E90A1FE5C3D0A46
     735.781µs : 0000000 | 1630B8A0062DF2282D00EC3083748DC7E32636A218A73BE8C549C794B282585E13CCC11D86398202E0B90248A490BDA339381E2FD890193B3E90A1FE5C3D0A46
     774.886µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63BE3B6E5E847DBBED9F0F803415365455B58D0E98A1E9397360602A71331D6CA48290E3A423A7640B8286CB
     810.298µs : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA3532043A331B78B190EDE7A5A0F5FE710B924F924C63D821350A642F2FAF97C9B808B973DF4599F2940514CA2
   13.422896ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D27BB8366DBA3D65776F8D5306A58443276A9C1A9EB1290C6F044BED35A05BA9277720EA6747035E7527607
   14.593501ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C37440DFC0D9173822DAC758679E2BBC938BD66DF4564A34A13C5CE0191D91B7CA0C35FAA62674E7E73FE18A171
   60.709999ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C14D43B5958861D279DED74A4D7CE41DC777BB227804891E86C4090892DF37145D95CF13F8FEBF1E4A2AE0B
   77.937651ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D145D7F71CF9CA61B3B0B96D8D273DF9EBB8B5B60D0CE73214F8FD7F958E93D51CA68992F0C9D790B44772A
   93.871708ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E09013D14E2A97834293613D499EEA95F7BB7687119DE858B2A0C9921069B5BF68ECC3FF4FB1CD0966065AB
   101.64529ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59DB78E99924438C381D13A45557F932DF1ED0B70CDC240C950815AC7D708F9413A7962B60140B4DE40893D2B
  191.184212ms : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC39FE5F40EB8AE1D2CA1B78A83ABBE73DA136628BB51081FC3BCAC33A852F12A041D3DBE04128EB6B295E8A4
  238.684753ms : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D09383665B2114E89FADD1F4FFC0995BFE50DF53DD013DD35CBAA94E2445064F7D02D7D29B515E58FE8F08EDC1348
   412.66365ms : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4CB15D7B2508882725BDDFAEE520A9EAC208AC567DF204AD19C6F6CE6670F5EF47BBB19D8390B22A53C96AF9
   717.16789ms : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA3859C88C258C1AC521A9001475E285CB5D2150DB90B690CA3C42829A6D55D1524DE8F8ED3FDD10CCD46387
  6.353699241s : завершение опроса
10 горутин:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -g=10
горутин 10; размер блока 8000
      616.94µs : 0000001 | 1630B8A0062DF2282D00EC3083748DC7E32636A218A73BE8C549C794B282585E13CCC11D86398202E0B90248A490BDA339381E2FD890193B3E90A1FE5C3D0A46
     749.513µs : 0000000 | 1630B8A0062DF2282D00EC3083748DC7E32636A218A73BE8C549C794B282585E13CCC11D86398202E0B90248A490BDA339381E2FD890193B3E90A1FE5C3D0A46
     786.895µs : 0000002 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0B488A51FB7523D1FB9F81500A584F1A821366096C373ADB11D1A303CE783BE26D9BB512A4DC101AD4E5AF8
      826.58µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63BE3B6E5E847DBBED9F0F803415365455B58D0E98A1E9397360602A71331D6CA48290E3A423A7640B8286CB
      862.52µs : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA3532043A331B78B190EDE7A5A0F5FE710B924F924C63D821350A642F2FAF97C9B808B973DF4599F2940514CA2
    9.018367ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D27BB8366DBA3D65776F8D5306A58443276A9C1A9EB1290C6F044BED35A05BA9277720EA6747035E7527607
    9.773428ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C37440DFC0D9173822DAC758679E2BBC938BD66DF4564A34A13C5CE0191D91B7CA0C35FAA62674E7E73FE18A171
   37.707047ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C14D43B5958861D279DED74A4D7CE41DC777BB227804891E86C4090892DF37145D95CF13F8FEBF1E4A2AE0B
   48.123158ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D145D7F71CF9CA61B3B0B96D8D273DF9EBB8B5B60D0CE73214F8FD7F958E93D51CA68992F0C9D790B44772A
   56.167293ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E09013D14E2A97834293613D499EEA95F7BB7687119DE858B2A0C9921069B5BF68ECC3FF4FB1CD0966065AB
   60.688498ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59DB78E99924438C381D13A45557F932DF1ED0B70CDC240C950815AC7D708F9413A7962B60140B4DE40893D2B
  119.118521ms : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC39FE5F40EB8AE1D2CA1B78A83ABBE73DA136628BB51081FC3BCAC33A852F12A041D3DBE04128EB6B295E8A4
  151.535161ms : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D09383665B2114E89FADD1F4FFC0995BFE50DF53DD013DD35CBAA94E2445064F7D02D7D29B515E58FE8F08EDC1348
  255.008268ms : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4CB15D7B2508882725BDDFAEE520A9EAC208AC567DF204AD19C6F6CE6670F5EF47BBB19D8390B22A53C96AF9
   427.94446ms : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA3859C88C258C1AC521A9001475E285CB5D2150DB90B690CA3C42829A6D55D1524DE8F8ED3FDD10CCD46387
   3.40875582s : завершение опроса
20 горутин:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -g=20
горутин 20; размер блока 8000
     423.625µs : 0000000 | 29516625AB81DCBDC359B0D0767FCE4CA9068D94265263BD1A97901DD698DF1AAA9D89D3291ACBE6D526F6F9C77F00AA6EC5EEB794AD21B5A66329BE901FDA07
     560.377µs : 0000009 | 1D4702C51D3E53DD992B9B739D68D24F93BC4FF19EEDAEAD21548F068ED4D9B6F01F6F659AEE7E5115AF78FBF34AB28483184E8E2C6DB59F93F15F2AF0465AC7
     652.077µs : 0000011 | 1BC5A8F324FDAB31B4CF64160651D06F7F6D79E4BB350035AC9528E7CF13F6351F9C4B0C1F7474F92BACDD36C15D0E4C12A7BFA050548914EDF9D12F3FD640C2
     680.432µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63BE3B6E5E847DBBED9F0F803415365455B58D0E98A1E9397360602A71331D6CA48290E3A423A7640B8286CB
     708.837µs : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA3532043A331B78B190EDE7A5A0F5FE710B924F924C63D821350A642F2FAF97C9B808B973DF4599F2940514CA2
    5.051884ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D27BB8366DBA3D65776F8D5306A58443276A9C1A9EB1290C6F044BED35A05BA9277720EA6747035E7527607
    5.489729ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C37440DFC0D9173822DAC758679E2BBC938BD66DF4564A34A13C5CE0191D91B7CA0C35FAA62674E7E73FE18A171
   24.977029ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C14D43B5958861D279DED74A4D7CE41DC777BB227804891E86C4090892DF37145D95CF13F8FEBF1E4A2AE0B
   32.609653ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D145D7F71CF9CA61B3B0B96D8D273DF9EBB8B5B60D0CE73214F8FD7F958E93D51CA68992F0C9D790B44772A
   39.562834ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E09013D14E2A97834293613D499EEA95F7BB7687119DE858B2A0C9921069B5BF68ECC3FF4FB1CD0966065AB
   44.908035ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59DB78E99924438C381D13A45557F932DF1ED0B70CDC240C950815AC7D708F9413A7962B60140B4DE40893D2B
   82.259814ms : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC39FE5F40EB8AE1D2CA1B78A83ABBE73DA136628BB51081FC3BCAC33A852F12A041D3DBE04128EB6B295E8A4
  102.158082ms : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D09383665B2114E89FADD1F4FFC0995BFE50DF53DD013DD35CBAA94E2445064F7D02D7D29B515E58FE8F08EDC1348
   181.05477ms : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4CB15D7B2508882725BDDFAEE520A9EAC208AC567DF204AD19C6F6CE6670F5EF47BBB19D8390B22A53C96AF9
  315.812024ms : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA3859C88C258C1AC521A9001475E285CB5D2150DB90B690CA3C42829A6D55D1524DE8F8ED3FDD10CCD46387
  2.703751513s : завершение опроса
40 горутин:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -g=40
горутин 40; размер блока 8000
       2.113µs : 0000000 | 1630B8A0062DF2282D00EC3083748DC7E32636A218A73BE8C549C794B282585E13CCC11D86398202E0B90248A490BDA339381E2FD890193B3E90A1FE5C3D0A46
      107.24µs : 0000002 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0B488A51FB7523D1FB9F81500A584F1A821366096C373ADB11D1A303CE783BE26D9BB512A4DC101AD4E5AF8
     212.089µs : 0000001 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0B488A51FB7523D1FB9F81500A584F1A821366096C373ADB11D1A303CE783BE26D9BB512A4DC101AD4E5AF8
     580.669µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63BE3B6E5E847DBBED9F0F803415365455B58D0E98A1E9397360602A71331D6CA48290E3A423A7640B8286CB
     752.006µs : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA3532043A331B78B190EDE7A5A0F5FE710B924F924C63D821350A642F2FAF97C9B808B973DF4599F2940514CA2
     5.81344ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C37440DFC0D9173822DAC758679E2BBC938BD66DF4564A34A13C5CE0191D91B7CA0C35FAA62674E7E73FE18A171
   20.212925ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C14D43B5958861D279DED74A4D7CE41DC777BB227804891E86C4090892DF37145D95CF13F8FEBF1E4A2AE0B
   25.819473ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D145D7F71CF9CA61B3B0B96D8D273DF9EBB8B5B60D0CE73214F8FD7F958E93D51CA68992F0C9D790B44772A
    33.67462ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E09013D14E2A97834293613D499EEA95F7BB7687119DE858B2A0C9921069B5BF68ECC3FF4FB1CD0966065AB
   36.420973ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59DB78E99924438C381D13A45557F932DF1ED0B70CDC240C950815AC7D708F9413A7962B60140B4DE40893D2B
   36.506145ms : 0014873 | 0002D2DA3F63FB9805B47609C6225191989B49E59DB78E99924438C381D13A45557F932DF1ED0B70CDC240C950815AC7D708F9413A7962B60140B4DE40893D2B
    65.16904ms : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC39FE5F40EB8AE1D2CA1B78A83ABBE73DA136628BB51081FC3BCAC33A852F12A041D3DBE04128EB6B295E8A4
   80.724796ms : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D09383665B2114E89FADD1F4FFC0995BFE50DF53DD013DD35CBAA94E2445064F7D02D7D29B515E58FE8F08EDC1348
  139.752991ms : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4CB15D7B2508882725BDDFAEE520A9EAC208AC567DF204AD19C6F6CE6670F5EF47BBB19D8390B22A53C96AF9
  250.602285ms : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA3859C88C258C1AC521A9001475E285CB5D2150DB90B690CA3C42829A6D55D1524DE8F8ED3FDD10CCD46387
  2.043965296s : завершение опроса

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 29 фев 2024, 02:53

Olej писал(а):
27 фев 2024, 20:22

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -h
...
Чуть переделал программу (несущественно), так чтобы можно было ограничивать показ хешей, не полностью, а только заказанную начальную часть... Вот так:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -w20
flag provided but not defined: -w20
Usage of ./mining:
  -b int
        размер блока (default 1000)
  -g int
        число горутин (default 1)
  -v uint
        лимит поиска (default 32767)
  -w int
        ширина вывода
Нас интересует как цель майнинга число ведущих нулей найденного хеша, а так его будет хорошо видно...
И интересно сравнить, теперь это лучше видно, скорость майнинга в зависимости а). от числа задействованных процессоров (числа горутин -g) + б). эту же скорость когда число горутин заметно превышает число физических процессоров/ядер.
Вот на таком компьютере (это сервер):

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3$ inxi -Cxxx
CPU:
  Info: 2x 10-core model: Intel Xeon E5-2470 v2 bits: 64 type: MT MCP SMP
    smt: enabled arch: Ivy Bridge rev: 4 cache: L1: 2x 640 KiB (1.2 MiB)
    L2: 2x 2.5 MiB (5 MiB) L3: 2x 25 MiB (50 MiB)
  Speed (MHz): avg: 1765 high: 2781 min/max: 1200/3200 cores: 1: 1938
    2: 1494 3: 1876 4: 2781 5: 1523 6: 1464 7: 1591 8: 1317 9: 1537 10: 2689
    11: 2436 12: 1274 13: 2347 14: 1332 15: 2015 16: 1241 17: 1578 18: 1458
    19: 1624 20: 1207 21: 1306 22: 1366 23: 1347 24: 1999 25: 1317 26: 2708
    27: 1340 28: 2667 29: 1453 30: 2682 31: 1565 32: 1743 33: 1633 34: 2487
    35: 1502 36: 1417 37: 1568 38: 2667 39: 1435 40: 1711 bogomips: 192047
  Flags: avx ht lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx
Здесь Linux видит 40 процессоров/ядер (на самом деле процессоров, чипов, там 2, но у каждого по 20 ядер):

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3$ nproc
40

Но он в этом обманывается! :oops: :roll:
Ядер там 20 + 20 ещё за счёт гипертрединга ... но это больше из области продавцов воздуха... ;-)
Вот выполнение чисто последовательное - 1 горутина:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -w 20
горутин 1; размер блока 8000
     201.692µs : 0000000 | 29516625AB81DCBDC359B0D0767FCE4CA9068D9426...
     260.586µs : 0000001 | 1630B8A0062DF2282D00EC3083748DC7E32636A218...
     275.151µs : 0000002 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0...
     783.843µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63...
    1.693275ms : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA353...
   51.461271ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D...
   57.818574ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C3744...
  341.379842ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C...
  442.883926ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D...
  513.695822ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E...
  552.271948ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59D...
  1.211426755s : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC3...
  1.449270231s : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D093836...
   2.45740637s : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4C...
  3.953867565s : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA...
 32.850807613s : завершение опроса
Занятие довольно тоскливое, 33 секунды ... а при больших заказанных параметрах можно и часами ждать!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go : параллельное выполнение

Непрочитанное сообщение Olej » 29 фев 2024, 03:06

Olej писал(а):
29 фев 2024, 02:53
от числа задействованных процессоров (числа горутин
Сравниваем:
5 процессоров:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -w=20 -g=5
горутин 5; размер блока 8000
     669.669µs : 0000001 | 1630B8A0062DF2282D00EC3083748DC7E32636A218...
     874.229µs : 0000000 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0...
     907.066µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63...
     928.083µs : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA353...
   13.654409ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D...
   14.801917ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C3744...
   60.285762ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C...
   79.566047ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D...
   93.381098ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E...
  101.162274ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59D...
  204.616196ms : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC3...
   262.54894ms : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D093836...
  457.735363ms : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4C...
  774.432353ms : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA...
  6.251561417s : завершение опроса
32,85÷5=6,57
10 процессоров:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -w=20 -g=10
горутин 10; размер блока 8000
     740.682µs : 0000002 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0...
     833.261µs : 0000000 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0...
     918.637µs : 0000001 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0...
     965.187µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63...
     987.167µs : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA353...
    8.705156ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D...
    9.351802ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C3744...
   35.925814ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C...
   45.522858ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D...
   53.511255ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E...
   58.006366ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59D...
  105.798054ms : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC3...
  133.613908ms : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D093836...
  232.379986ms : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4C...
  408.527962ms : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA...
  3.625750993s : завершение опроса
32,85÷10=3,285
20 процессоров:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -w=20 -g=20
горутин 20; размер блока 8000
      664.13µs : 0000000 | 1630B8A0062DF2282D00EC3083748DC7E32636A218...
     826.513µs : 0000001 | 1630B8A0062DF2282D00EC3083748DC7E32636A218...
     853.143µs : 0000002 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0...
     884.313µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63...
      905.52µs : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA353...
     922.097µs : 0000027 | 0066A9BBA0F4149C5423D136D92484D58AE62EA353...
    6.615353ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D...
    7.185671ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C3744...
   27.907083ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C...
   35.926656ms : 0011400 | 0008CCC1EBE1AFAC852097E6162A77A61B80B2234D...
   42.138362ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E...
   45.802609ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59D...
   86.149212ms : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC3...
  106.299527ms : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D093836...
  184.786312ms : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4C...
  321.035921ms : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA...
  2.704524837s : завершение опроса
32,85÷20=1,6425 ... вот здесь начали отставать от линейной зависимости :!: - приблизились к числу физических процессоров ... свободных процессоров не остаётся, и другие приложения Linux должны работать...
40 ядер:

Код: Выделить всё

olej@R420:~/2024/own.BOOKs/BHV.Go.3/examples.work/goproc/mining$ ./mining -b 8000 -v 1000000 -w=20 -g=40
горутин 40; размер блока 8000
       1.448µs : 0000000 | 1630B8A0062DF2282D00EC3083748DC7E32636A218...
      80.552µs : 0000002 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0...
     101.152µs : 0000001 | 110649121CB89CDF23BBDEF0A182D521D9C95C99D0...
     735.311µs : 0000013 | 0A70DE125FDF60C82600AA5F7E787D4EF60CED4C63...
     832.933µs : 0000031 | 0066A9BBA0F4149C5423D136D92484D58AE62EA353...
    5.545726ms : 0001490 | 003AC6A27060ACBCFBEC6D7AB123AF80AAFB6CB60D...
    6.086617ms : 0001670 | 001443A6F720352EC00B335F0060DA1701E52C3744...
   21.325801ms : 0008708 | 000FED88A9BE6D729B70589C5F34884B24ABB3538C...
   33.648817ms : 0013631 | 0007B65302A8EF35D6AC335879CA65FBCECB5BFD7E...
   37.524484ms : 0014874 | 0002D2DA3F63FB9805B47609C6225191989B49E59D...
   65.608028ms : 0028765 | 000269355591B2C2EAD19F7F77F86F93445F10FDC3...
   82.251744ms : 0036214 | 00012E5924E21796CB3E2B9CBBBA6495A90D093836...
   142.65488ms : 0063781 | 000038E088D0320665B3EC72000E0250CCB55F9B4C...
  242.268921ms : 0112182 | 00001797F86B7E769526228A1E636BD8B3EA34EBCA...
  2.013846182s : завершение опроса
Улучшение совсем незначительное 2704524837÷2013846182=1,34296495 - 34%, за счёт дополнительных 20 ядер, число ядер возрасло в 2 раза!

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей