chanrpc

package
Version: v0.0.0-...-a6578a7 Latest Latest
Warning

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

Go to latest
Published: May 20, 2016 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

Example
package main

import (
	"fmt"
	"sync"

	"github.com/abel/leaf/chanrpc"
)

func main() {
	s := chanrpc.NewServer(10)

	var wg sync.WaitGroup
	wg.Add(1)

	// goroutine 1
	go func() {
		s.Register("f0", func(args []interface{}) {

		})

		s.Register("f1", func(args []interface{}) interface{} {
			return 1
		})

		s.Register("fn", func(args []interface{}) []interface{} {
			return []interface{}{1, 2, 3}
		})

		s.Register("add", func(args []interface{}) interface{} {
			n1 := args[0].(int)
			n2 := args[1].(int)
			return n1 + n2
		})

		wg.Done()

		for {
			err := s.Exec(<-s.ChanCall)
			if err != nil {
				fmt.Println(err)
			}
		}
	}()

	wg.Wait()
	wg.Add(1)

	// goroutine 2
	go func() {
		c := s.Open(10)

		// sync
		err := c.Call0("f0")
		if err != nil {
			fmt.Println(err)
		}

		r1, err := c.Call1("f1")
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Println(r1)
		}

		rn, err := c.CallN("fn")
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Println(rn[0], rn[1], rn[2])
		}

		ra, err := c.Call1("add", 1, 2)
		if err != nil {
			fmt.Println(err)
		} else {
			fmt.Println(ra)
		}

		// asyn
		c.AsynCall("f0", func(err error) {
			if err != nil {
				fmt.Println(err)
			}
		})

		c.AsynCall("f1", func(ret interface{}, err error) {
			if err != nil {
				fmt.Println(err)
			} else {
				fmt.Println(ret)
			}
		})

		c.AsynCall("fn", func(ret []interface{}, err error) {
			if err != nil {
				fmt.Println(err)
			} else {
				fmt.Println(ret[0], ret[1], ret[2])
			}
		})

		c.AsynCall("add", 1, 2, func(ret interface{}, err error) {
			if err != nil {
				fmt.Println(err)
			} else {
				fmt.Println(ret)
			}
		})

		c.Cb(<-c.ChanAsynRet)
		c.Cb(<-c.ChanAsynRet)
		c.Cb(<-c.ChanAsynRet)
		c.Cb(<-c.ChanAsynRet)

		// go
		s.Go("f0")

		wg.Done()
	}()

	wg.Wait()

}
Output:

1
1 2 3
3
1
1 2 3
3

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func PanicHandler

func PanicHandler()

Types

type AgentCaller

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

func (*AgentCaller) Call

func (self *AgentCaller) Call(args []interface{})

func (*AgentCaller) Regist

func (self *AgentCaller) Regist(msg interface{}, fn interface{}) bool

type CallInfo

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

type Client

type Client struct {
	ChanAsynRet chan *RetInfo
	// contains filtered or unexported fields
}

func (*Client) AsynCall

func (c *Client) AsynCall(id interface{}, _args ...interface{})

func (*Client) Call0

func (c *Client) Call0(id interface{}, args ...interface{}) error

func (*Client) Call1

func (c *Client) Call1(id interface{}, args ...interface{}) (interface{}, error)

func (*Client) CallN

func (c *Client) CallN(id interface{}, args ...interface{}) ([]interface{}, error)

func (*Client) Cb

func (c *Client) Cb(ri *RetInfo)

func (*Client) Close

func (c *Client) Close()

type RetInfo

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

type Server

type Server struct {
	ChanCall chan *CallInfo
	// contains filtered or unexported fields
}

one server per goroutine (goroutine not safe) one client per goroutine (goroutine not safe)

func NewServer

func NewServer(l int) *Server

func (*Server) Close

func (s *Server) Close()

func (*Server) Exec

func (s *Server) Exec(ci *CallInfo) (err error)

func (*Server) Go

func (s *Server) Go(id interface{}, args ...interface{})

goroutine safe

func (*Server) Open

func (s *Server) Open(l int) *Client

goroutine safe

func (*Server) Register

func (s *Server) Register(id interface{}, f interface{})

you must call the function before calling Open and Go

Jump to

Keyboard shortcuts

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