runner

package module
v1.0.2-rc1 Latest Latest
Warning

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

Go to latest
Published: Jun 19, 2026 License: MIT Imports: 9 Imported by: 2

README

Compogo Runner

Go Reference

Фреймворк для управления фоновыми процессами в приложениях на Compogo.

Предоставляет:

  • Запуск и остановку фоновых задач (процессов)
  • Graceful shutdown через io.Closer
  • Middleware для логирования, метрик, восстановления после паник и автоматического перезапуска
  • Потокобезопасное управление процессами

Установка

go get github.com/Compogo/runner

Быстрый старт

package main

import (
    "context"
    "time"

    "github.com/Compogo/compogo"
    "github.com/Compogo/runner"
    runnerlogger "github.com/Compogo/runner/middleware/logger"
)

func main() {
    app := compogo.NewApp("myapp",
        // Подключаем Runner
        compogo.WithComponents(&runner.Component),
        // Подключаем middleware для логирования
        compogo.WithComponents(&runnerlogger.Component),
        // Другие опции
        compogo.WithContainer(container, containerCmp),
        compogo.WithLogger(logger, loggerCmp),
        compogo.WithOsSignalCloser(),
    )

    if err := app.Serve(); err != nil {
        panic(err)
    }
}

Использование

Создание процесса
// Создание задачи через Task
task := runner.NewTask("worker", func(ctx context.Context) error {
    // Фоновая работа
    select {
    case <-ctx.Done():
        return nil
    case <-time.After(time.Second):
        // делаем работу
    }
    return nil
})

// Или через структуру, реализующую интерфейс Process
type MyProcess struct {
    name string
}

func (p *MyProcess) Process(ctx context.Context) error {
    // работа
    return nil
}

func (p *MyProcess) Name() string {
    return p.name
}

func (p *MyProcess) Close() error {
    // очистка
    return nil
}
Запуск процессов
// Получение Runner из контейнера
var r runner.Runner
container.Invoke(func(runner runner.Runner) { r = runner })

// Запуск одного процесса
r.RunProcess(task)

// Запуск нескольких процессов
r.RunProcesses(task1, task2, task3)
Остановка процессов
// Остановка по объекту
r.StopProcess(task)

// Остановка по имени
r.StopProcessByName("worker")

// Остановка всех процессов (через Close)
r.Close()
Проверка наличия процессов
if r.HasProcess(task) {
    // процесс уже запущен
}

if r.HasProcessByName("worker") {
    // процесс с именем "worker" запущен
}

Middleware

Logger — Логирование выполнения

Логирует начало, завершение и ошибки выполнения процессов.

import runnerlogger "github.com/Compogo/runner/middleware/logger"

// Подключение через компонент
app.AddComponents(&runnerlogger.Component)

// Или программно
var r runner.Runner
var m *runnerlogger.Logger
container.Invoke(func(runner runner.Runner, logger *runnerlogger.Logger) {
    r.Use(logger)
})
Metric — Сбор метрик Prometheus

Metric — Сбор метрик Prometheus

import runnermetric "github.com/Compogo/runner/middleware/metric"

// Подключение через компонент
app.AddComponents(&runnermetric.Component)

// Метрика: compogo_runner_task{app="myapp"}
Recover — Восстановление после паник

Перехватывает паники в процессах, логирует стек-трейс и преобразует в ошибку.

import runnerrecover "github.com/Compogo/runner/middleware/recover"

// Подключение через компонент
app.AddComponents(&runnerrecover.Component)
Restore — Автоматический перезапуск

При ошибке выполнения процесса перезапускает его с заданной задержкой.

import runnerrestore "github.com/Compogo/runner/middleware/restore"

// Подключение через компонент
app.AddComponents(&runnerrestore.Component)

// Настройка задержки через флаг
// --runner.middleware.restore.delay=5s

Зависимости

  • Compogo — основной фреймворк
  • Prometheus — метрики (опционально)

Лицензия

MIT License

Copyright (c) 2026 Compogo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// TaskAlreadyExistsError возникает при попытке запустить уже существующий процесс.
	TaskAlreadyExistsError = errors.New("task already exists")

	// TaskUndefinedError возникает при попытке остановить несуществующий процесс.
	TaskUndefinedError = errors.New("task is undefined")
)

Ошибки, возвращаемые при работе с Runner.

View Source
var Component = compogo.Component{
	Name: "runner",
	Init: compogo.StepFunc(func(container compogo.Container) error {
		return container.Provides(
			newRunner,
			func(r *runner) Runner { return r },
		)
	}),
	Stop: compogo.StepFunc(func(container compogo.Container) error {
		return container.Invoke(func(d *runner) error {
			return d.Close()
		})
	}),
}

Component — компонент Runner для Compogo. Регистрирует Runner в DI-контейнере и останавливает его при завершении приложения.

Functions

This section is empty.

Types

type Middleware

type Middleware interface {
	// Middleware оборачивает ProcessFunc.
	// Получает текущий Process и следующую функцию в цепочке.
	// Возвращает новую функцию, которая будет вызвана вместо следующей.
	Middleware(Process, ProcessFunc) ProcessFunc
}

Middleware — интерфейс для цепочки обработчиков процессов. Позволяет оборачивать ProcessFunc для добавления логирования, метрик, восстановления после паник и т.д.

Пример:

type LoggerMiddleware struct {
    logger Logger
}

func (m *LoggerMiddleware) Middleware(p Process, next ProcessFunc) ProcessFunc {
    return func(ctx context.Context) error {
        m.logger.Info("starting", "process", p.Name())
        err := next(ctx)
        m.logger.Info("finished", "process", p.Name())
        return err
    }
}

type MiddlewareFunc

type MiddlewareFunc func(Process, ProcessFunc) ProcessFunc

MiddlewareFunc — функциональный адаптер для Middleware. Позволяет использовать функции как middleware.

Пример:

middleware := MiddlewareFunc(func(p Process, next ProcessFunc) ProcessFunc {
    return func(ctx context.Context) error {
        // before
        err := next(ctx)
        // after
        return err
    }
})

func (MiddlewareFunc) Middleware

func (m MiddlewareFunc) Middleware(p Process, next ProcessFunc) ProcessFunc

Middleware реализует интерфейс Middleware для MiddlewareFunc.

type Process

type Process interface {
	io.Closer
	Process(ctx context.Context) error
	Name() string
}

Process — интерфейс выполняемого процесса. Сочетает в себе:

  • io.Closer — для остановки процесса
  • Process(ctx) — для выполнения работы
  • Name() — для идентификации

Процессы запускаются через Runner и выполняются в отдельных горутинах.

type ProcessFunc

type ProcessFunc func(ctx context.Context) error

ProcessFunc — функция, выполняемая процессом. Принимает контекст и возвращает ошибку.

type Runner

type Runner interface {
	io.Closer
	// RunProcess запускает один процесс.
	RunProcess(Process) error

	// RunProcesses запускает несколько процессов.
	RunProcesses(...Process) error

	// StopProcess останавливает процесс по объекту.
	StopProcess(Process) error

	// StopProcessByName останавливает процесс по имени.
	StopProcessByName(string) error

	// HasProcess проверяет наличие процесса по объекту.
	HasProcess(Process) bool

	// HasProcessByName проверяет наличие процесса по имени.
	HasProcessByName(string) bool

	// Use добавляет middleware для всех процессов.
	Use(middlewares ...Middleware)
}

Runner управляет жизненным циклом процессов (Task). Предоставляет возможности:

  • Запуска процессов с поддержкой middleware
  • Остановки процессов по имени или объекту
  • Graceful shutdown через io.Closer
  • Проверки наличия процессов

Runner потокобезопасен и может использоваться из нескольких горутин.

type Task

type Task struct {
	// contains filtered or unexported fields
}

Task — базовая реализация интерфейса Process.

Пример:

task := NewTask("worker", func(ctx context.Context) error {
    // работа
    return nil
})

runner.RunProcess(task)

func NewTask

func NewTask(name string, processFunc ProcessFunc, middlewares ...Middleware) *Task

NewTask создаёт новый Task. Принимает имя, функцию выполнения и опциональные middleware.

func (*Task) Close added in v0.0.10

func (task *Task) Close() error

Close останавливает задачу, отменяя её контекст. Реализует интерфейс io.Closer.

func (*Task) Name

func (task *Task) Name() string

Name возвращает имя задачи. Реализует интерфейс Process.

func (*Task) Process added in v0.0.10

func (task *Task) Process(ctx context.Context) error

Process запускает выполнение задачи. Создаёт отменяемый контекст и применяет middleware. Реализует интерфейс Process.

Directories

Path Synopsis
middleware

Jump to

Keyboard shortcuts

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