YTask — это асинхронная система задач для распределённого выполнения работ на Go
# установите основной пакет
go get -u github.com/gojuukaze/YTask/v3
# установите брокеры и бэкэнды
go get -u github.com/gojuukaze/YTask/drives/redis/v3
go get -u github.com/gojuukaze/YTask/drives/rabbitmq/v3
go get -u github.com/gojuukaze/YTask/drives/mongo2/v3
go get -u github.com/gojuukaze/YTask/drives/memcache/v3
package main
import (
"context"
"os"
"os/signal"
"syscall"
"github.com/gojuukaze/YTask/drives/redis/v3"
"github.com/gojuukaze/YTask/v3"
)
// Определяем две задачи.
// Параметры задач и возвращаемые значения поддерживают все типы данных, которые могут быть сериализованы в JSON.
func add(a int, b int) int {
return a + b
}
type User struct {
Id int
Name string
}
func appendUser(user User, ids []int, names []string) []User {
var r = make([]User, 0)
r = append(r, user)
for i := range ids {
r = append(r, User{ids[i], names[i]})
}
return r
}
``````go
func main() {
// The last parameter of RedisBroker represents the size of the connection pool. If you do not require a worker process, you can set it to 0 (the default value is 0, and the server-side default value is 3).
// Otherwise, set it as needed; the maximum value should not exceed the number of tasks running simultaneously.
broker := redis.NewRedisBroker("127.0.0.1", "6379", "", 0, 3)
}
``` // Последний параметр RedisBackend — размер пула соединений. Для серверной части, если <=0, используется значение по умолчанию.
// Значение по умолчанию равно min(10, numWorkers)
backend := redis.NewRedisBackend("127.0.0.1", "6379", "", 0, 0)
ser := ytask.Server.NewServer(
ytask.Config.Broker(&broker),
ytask.Config.Backend(&backend), // Может быть не установлен
ytask.Config.Debug(true),
ytask.Config.StatusExpires(60 * 5),
ytask.Config.ResultExpires(60 * 5),
)
``````md
## Пример сервера
```go
// Регистрация задачи
ser.Add("group1", "add", add)
ser.Add("group1", "append_user", appendUser)
// Запуск сервера с уровнем параллелизма равным 3
ser.Run("group1", 3)
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
ser.Shutdown(context.Background())
}
package main
import (
"fmt"
"github.com/gojuukaze/YTask/drives/redis/v3"
"github.com/gojuukaze/YTask/v3"
"github.com/gojuukaze/YTask/v3/server"
"time"
)
type User struct {
Id int
Name string
}
var client server.Client
func main() {
// Для клиентской стороны требуется установка размера пула соединений
broker := redis.NewRedisBroker("127.0.0.1", "6379", "", 0, 5)
backend := redis.NewRedisBackend("127.0.0.1", "6379", "", 0, 5)
ser := ytask.Server.NewServer(
ytask.Config.Broker(&broker),
ytask.Config.Backend(&backend),
ytask.Config.Debug(true),
ytask.Config.StatusExpires(60 * 5),
ytask.Config.ResultExpires(60 * 5),
)
client = ser.GetClient()
// Отправка задачи
taskId, _ := client.Send("group1", "add", 123, 44)
// Получение результата
result, _ := client.GetResult(taskId, 2*time.Second, 300*time.Millisecond)
if result.IsSuccess() {
// Есть несколько способов получения возвращаемого значения, подробнее см. документацию
sum, _ := result.GetInt64(0)
// или
var sum2 int
result.Get(0, &sum2)
} fmt.Println("add(123,44) =", int(sum))
}
// Отправка структур, массивов и т.д.
taskId, _ = client.Send("group1", "append_user", User{1, "aa"}, []int{322, 11}, []string{"bb", "cc"})
result, _ = client.GetResult(taskId, 2*time.Second, 300*time.Millisecond)
var users []User
result.Get(0, &users)
fmt.Println(users)
}
Также обратите внимание на директорию пример.
cd example/server
go run main.go
cd example/send
go run send/main.go
Открытое программное обеспечение — это сложная работа, если вам понравилось данное решение, пожалуйста, сделайте небольшой донат.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )