1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xiawucha365-sago.v2

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

#sago.v2

Описание

  • Историческая версия https://gitee.com/xiawucha365/sago
  • Полезный питательный материал, созданный вручную на языке C
  • Предоставляет легкий и управляемый набор скриптов для снижения сложности параллельной разработки программ

Возможности программы

  • Поддержка конфигурационных файлов для тестовых/производственных сред
  • Логирование (поддержка уровней ошибок, разделение лог-файлов по дням/месяцам, автоматическое удаление старых логов, вывод цветного текста)
  • Параллелизация (статистика времени выполнения, пулы корутин)
  • Внедрение зависимостей
  • Инструменты командной строки (генератор базовой структуры проекта, генератор файлов модели)

Установка go.mod

  • Необходимо установить модуль go, после успешной установки настроить переменные окружения

  • Рекомендованное использование IDE: GoLand версии >= 2019.2, после установки будет автоматически обнаружено и внедрено, go.mod — это новая функциональность Golang, которая не поддерживается старыми версиями

Практическое руководство

Введение фреймворка

go get gitee.com/xiawucha365/sago.v2

Конфигурационный файл dev.toml

=================Общие настройки======================
app_name = "sago"
app_version = "2.3"
debug = false # в режиме отладки выводятся более подробные сообщения об ошибках
```==============
### ORM
[mysql]
addr = "127.0.0.1:3376"
username = "mfw_dev"
password = ""
charset = "utf8"
dbname = ""
# Поддерживает xorm/gorm
engine = "xorm"  

[mongodb]
addrs = ["127.0.0.1:3376", "127.0.0.2:3376", "127.0.0.3:3376"] # Поддерживает реплицированные множества и одиночные ноды
username = ""
password = ""
dbname = ""
replica_set = ""
engine = "mgo"

# Настройки Redis
[redis]
addr = ""
password = ""

# Логирование
[log]
# Директория логов (абсолютный путь), по умолчанию совпадает с директорией исполняемого файла
log_dir = ""
# Периодичность разделения логов month (по месяцам) day (по дням)
split_duration = "month"
# Уровень логирования info > warn > error (по умолчанию info)
level = "error"
# Количество дней, за которое хранятся логи, устаревшие логи будут автоматически удалены
max_age = 30

### Примечание

Поддерживает горячую перезагрузку конфигураций, например, при необходимости изменения debug=true во время работы программы, рекомендуется не менять конфигурацию баз данных во время выполнения.

##### Вывод конфигурации
```go
// Вывод конфигурации
sago.Gdi.Invoke(func(cf *config.Config) {
	sagoutil.PrintType(cf)
})
Использование логирования
sago.Gdi.Invoke(func(log *slog.Log) {
	defer log.Sync()
	log.Info("лог тест")
	log.Warn("лог тест")
	log.Error("лог тест")
})
```##### Операции с базой данных
```go
import (
	"fmt"
	"math/rand"
	"time"
	sago "gitee.com/xiawucha365/sago.v2"
	"gitee.com/xiawucha365/sago.v2/core/config"
	slog "gitee.com/xiawucha365/sago.v2/core/log"
	sagoutil "gitee.com/xiawucha365/sago.v2/core/util"
	"gitee.com/xiawucha365/sago.v2/core/orm"
	"gopkg.in/mgo.v2/bson"
)
func main() {
    // mysql=============================================================================================================
    // mysql 查询语句 в рамках фреймворка
    sago.Gdi.Invoke(func(db *orm.Db) {
        var demos []Demo
        _ = db.FindBySql("select * from t_creator_center limit 2", &demos)
        fmt.Println("xorm фреймворк запроса")
        sagoutil.PrintType(demos)
    })
}
```    //mysql xorm движок нативный запрос
    sago.Gdi.Invoke(func(db *orm.DbMysql) {
        var demos []Demo
        res, err := db.Engine.Xorm.QueryString("SELECT * FROM t_creator_center LIMIT 2")
        if err != nil {
            panic(err)
        } else {
            if res1, err := sagoutil.JsonEncode(res); err != nil {
                panic(err)
            } else {
                _ = sagoutil.JsonDecode(res1, &demos)
            }
        }
        fmt.Println("нативный xorm запрос")
        sagoutil.PrintType(demos)
    })

    //mysql gorm движок нативный запрос (необходимо изменить конфигурационный файл mysql-engine на gorm)

    //sago.Gdi.Invoke(func(db sago.GDbParams) {
    //
    //	var demos []Demo
    //	res := db.Mysql.Engine.Gorm.Raw("SELECT * FROM t_creator_center LIMIT 2").Find(&demos)
    //	if res.Error != nil {
    //		panic(res.Error)
    //	} else {
    //		fmt.Println("нативный gorm запрос")
    //		sagoutil.PrintType(demos)
    //	}
    //})

    //указание конкретной базы данных
    sago.Gdi.Invoke(func(cf *config.Config) {

        db := orm.GetMysqlConnByDb(cf, "gorm", "sale_contact")
        var demos []Demo2
        _ = db.FindBySql("SELECT * FROM t_hm_friend LIMIT 2", &demos)
        fmt.Println("запрос с указанием конкретной базы данных")
        sagoutil.PrintType(demos)

    })

    //использование addr для запроса
    sago.Gdi.Invoke(func(cf *config.Config) {

        db := orm.GetMysqlConnByAddr(cf, "", "mfw_dev:2cB509cc0bf@tcp(127.0.0.1:3376)/sale_spider?charset=utf8&parseTime=True&loc=Local")
        var demos []Demo
        _ = db.FindBySql("SELECT * FROM t_creator_center LIMIT 2", &demos)
        fmt.Println("запрос с использованием адреса")
        sagoutil.PrintType(demos)
    })

    //mongodb================================================
    //запрос в рамках фреймворка - требуется упаковка    // mgo native request
    sago.Gdi.Invoke(func(db *orm.DbMongodb) {
        var demo Item2
        if err := db.Engine.Mgo.C("video_info").Find(bson.M{"ptype": "YD"}).One(&demo); err != nil {
            panic(err)
        } else {
            fmt.Println("MongoDB query")
            sagoutil.PrintType(demo)
        }
    })
}
```###### Parallel components
```go
import (
    "fmt"
    "math/rand"
    "time"
    "gitee.com/xiawucha365/sago.v2/parallel"
)

type worker struct {
    ID int
}

func (m *worker) Task() error {```markdown
    fmt.Println("задача:", m.ID, "выполняется...")
    timen := rand.Intn(3)
    //fmt.Println(timen, "секунд")
    time.Sleep(time.Second * time.Duration(timen))
    fmt.Println("задача:", m.ID, "завершена")
    return nil
}

func main() {
    var items []int
    for i := 1; i <= 100; i++ {
        items = append(items, i)
    }

    sp := parallel.NewSPool(5, len(items), 0, false)

    for _, id := range items {
        np := worker{ID: id}
        sp.Commit(&np)
    }

    sp.RuntimeLog()
    sp.Release()
}

Дополнительные примеры

См. каталог examples

Участие в развитии


Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Предоставить набор лёгких и контролируемых каркасов для разработки сценариев, чтобы снизить сложность разработки параллельных программ. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/xiawucha365-sago.v2.git
git@api.gitlife.ru:oschina-mirror/xiawucha365-sago.v2.git
oschina-mirror
xiawucha365-sago.v2
xiawucha365-sago.v2
master