zoukankan      html  css  js  c++  java
  • go服务运行框架go-svc

    go-svc:https://github.com/judwhite/go-svc/svc

    go-svc支持linux和windows,应用只需实现Service接口即可。

    官方例子

    package main
    
    import (
    	"log"
    	"os"
    	"path/filepath"
    
    	"github.com/judwhite/go-svc/svc"
    )
    
    // implements svc.Service
    type program struct {
    	LogFile *os.File
    	svr     *server
    }
    
    func main() {
    	prg := program{
    		svr: &server{},
    	}
    	defer func() {
    		if prg.LogFile != nil {
    			prg.LogFile.Close()
    		}
    	}()
    
    	// call svc.Run to start your program/service
    	// svc.Run will call Init, Start, and Stop
    	if err := svc.Run(prg); err != nil {
    		log.Fatal(err)
    	}
    }
    
    func (p program) Init(env svc.Environment) error {
    	log.Printf("is win service? %v
    ", env.IsWindowsService())
    
    	// write to "example.log" when running as a Windows Service
    	if env.IsWindowsService() {
    		dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
    		if err != nil {
    			return err
    		}
    
    		logPath := filepath.Join(dir, "example.log")
    
    		f, err := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    		if err != nil {
    			return err
    		}
    
    		p.LogFile = f
    
    		log.SetOutput(f)
    	}
    
    	return nil
    }
    
    func (p program) Start() error {
    	log.Printf("Starting...
    ")
    	go p.svr.start()
    	return nil
    }
    
    func (p program) Stop() error {
    	log.Printf("Stopping...
    ")
    	if err := p.svr.stop(); err != nil {
    		return err
    	}
    	log.Printf("Stopped.
    ")
    	return nil
    }
    
    
    package main
    
    import (
    	"log"
    	"sync"
    	"time"
    )
    
    type server struct {
    	data chan int
    
    	exit chan struct{}
    	wg   sync.WaitGroup
    }
    
    func (s *server) start() {
    	s.data = make(chan int)
    	s.exit = make(chan struct{})
    
    	s.wg.Add(2)
    	go s.startSender()
    	go s.startReceiver()
    }
    
    func (s *server) stop() error {
    	close(s.exit)
    	s.wg.Wait()
    	return nil
    }
    
    func (s *server) startSender() {
    	ticker := time.NewTicker(time.Second)
    	count := 1
    	for {
    		select {
    		case <-ticker.C:
    			s.data <- count
    			count++
    		case <-s.exit:
    			s.wg.Done()
    			return
    		}
    	}
    }
    
    func (s *server) startReceiver() {
    	for {
    		select {
    		case n := <-s.data:
    			log.Printf("%d
    ", n)
    		case <-s.exit:
    			s.wg.Done()
    			return
    		}
    	}
    }
    
    
  • 相关阅读:
    基于docker swarm的搭建高可用web集群
    软链接和硬链接的区别
    PTA(Basic Level) Practice 刷题(部分) Python实现
    使用官方提供的方式在CentOS上安装docker
    mysql表分区的限制
    有个免费云服务器速度很快!
    PhpMyAdmin 配置文件现在需要一个短语密码的解决方法
    Django笔记:Memcached缓存系统
    Django笔记:文件上传
    Django笔记:表单验证
  • 原文地址:https://www.cnblogs.com/cqvoip/p/8078927.html
Copyright © 2011-2022 走看看