cmdConveer

package
v0.0.0-...-bbb754b Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 18, 2021 License: MIT Imports: 5 Imported by: 0

README

Конвейерное управление Миньонами
Или скорее модель конвейерного управления Горутинами

Конвейер и Миньоны

accessibility text

Термины

Конвейр – Отредактированная под свою задачу библиотека конвейерного управления Горутинами, представленная в данной теме.

Миньон – Горутина, которая выполняет полезную нагрузку в конвейере.

Где это может использоваться

  • В высоконагруженных средах, где постоянно поступают запросы и их нужно обрабатывать сложной логикой.
  • В ETL процессах, трансформации данных при загрузке или просто загрузки
  • В участках кода для гибкого распределения ресурсов в многоядерной системе, контролируя количество рутин для каких-либо операций
  • Для всего, что можно распоточить, поток данных, запросов, всего что можно передать в канал.

Как это работает

Пример простой задачи:

  1. Первый модуль может принимать может не принимать на вход канал, а данные читать с CSV, проводит приведение к типам, и отправляет в выходной канал.
  2. Открываем второй модуль, в котором на вход приходит выходной канал сток с первого.

Начинается процесс хеширования и схлопывания и отправляем новый тип данных в выходной канал.

  1. Открываем третий конвейер, на вход принимаем канал второго, и делаем вставку приходящих данных в базу.

Но для чего это спросите вы, не проще ли все это делать в теле одной функции?

Возможно, проще. Но 2-й конвейер тяжеловесный. Если в нем будет мало миньонов, то процесс будет медленным, а если много, то гонки за файл. Да и при в сем при этом еще надо открывать транзакцию, чтобы вставить потом это в базу. Весь этот процесс в одной функции будет медленным. А при таком подходе мы задаем дну рутину (миньона) в первом, 8-мь во втором и два-три на вставку. Таким образом каждый конвейер занимается своим делом и идет правильное распределение задач.

Зачем такая большая обертка?

Для управления такой большой армией конвейеров с армией миньонов. Данная реализация выполняет следующие функции:

  • Принимает команды на завершение работы всего конвейера.

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

  • Исключает проблемы с гонками внутри объекта.
  • Дает возможность с легкостью добавить нового рабочего в строй и у него будет свой номер.
  • Делает не сложным процесс и убирание лишних миньонов, а это уже возможность динамического распределения ресурсов.
  • Ассортимент инструментов завершения конвейера.

Асинхронный, синхронный, с сигналом завершения, количество сигналов если выходных каналов больше, без сигнала.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Box

type Box struct {
	OutCh chan Reject // Выходные даннае можно отправлять в следующий конвеер этим каналом

	GoodBy chan bool // Внешний сигнал, о том, что конвеер прекратил работу
	// contains filtered or unexported fields
}

func NewBalancer

func NewBalancer(boxData string, loger chan<- [4]string, ch chan Command) *Box

func (*Box) GetCores

func (c *Box) GetCores() (cores int)

Мункция, для запроса охраняемого значения, например тут количество запущеных миньончиков

func (*Box) RunMinion

func (p *Box) RunMinion()

Собственно сам внешний вызов, для безопасного открытия миньюна

func (*Box) SignalStoper

func (p *Box) SignalStoper(off <-chan bool)

Вторая вызывается как с приставкой GO, так и без На вход ждет канал с сигналом "Пора закругляться" Когда сигнал поступает, и мрут все миньоны посылает сигнал в публичный канал GoodBy. В Асинхронном режиме позволяет в фоновом режиме узнавать, что надо закругляться и сообщит о своей остановке В синхронном держит программу до получения сигнала и корректного завершения, так же посылает сигнал в GoodBy

func (*Box) Stop

func (p *Box) Stop()

Две публичные функции для завершения Первая вызывается в синхронном режиме (без приставки GO) Посылается сигнал "Стоп" всем миньонам, когда входящий канал опустеет и они все корректно пмрут, эта фкнкция перестанет держать вызывающую область. В Асинхронном режиме позволяет в фоновом подать сигнал закругляться, и сообщит о своей остановке в GoodBy В синхронном держит тело вызывающей фкнкции до корректного завершения, так же посылает сигнал в GoodBy

type Command

type Command struct {
	Name     string
	Executer string
	DirHome  string
	Args     []string
	Timeout  time.Duration
	Cfg      map[string]string
}

type Reject

type Reject struct {
	Name     string
	Status   int
	MyStdout string
	MyStderr string
	Comment  string
	Command  Command
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL