Introduzione a Go e RPC in Go

Similar documents
Go Tutorial. To do. A brief, gentle intro to Go. Next Networking. q Today


Go Cheat Sheet. Operators. Go in a Nutshell. Declarations. Basic Syntax. Hello World. Functions. Comparison. Arithmetic. Credits

developed ~2007 by Robert Griesemer, Rob Pike, Ken Thompson open source

Go for Java Developers

Erlang and Go (CS262a, Berkeley Fall 2016) Philipp Moritz

The Awesomeness of Go. Igor Lankin DevFest Karlsruhe, Nov 2016

Remote Procedure Call

Go Forth and Code. Jonathan Gertig. CSC 415: Programing Languages. Dr. Lyle

416 Distributed Systems. RPC Day 2 Jan 12, 2018

The Go Programming Language. Frank Roberts

Distributed Systems. Lecture 06 Remote Procedure Calls Thursday, September 13 th, 2018

Let s Go! Akim D le, Etienne Renault, Roland Levillain. June 8, TYLA Let s Go! June 8, / 58

Lecture Overview Methods and Interfaces Methods review Interfaces Example: using the sort interface Anonymous fields in structs

Go Tutorial. Arjun Roy CSE 223B, Spring 2017

416 Distributed Systems. RPC Day 2 Jan 11, 2017

Lecture 4: Golang Programming. Lecturer: Prof. Zichen Xu

Go Language September 2016

COMP-520 GoLite Tutorial

M/s. Managing distributed workloads. Language Reference Manual. Miranda Li (mjl2206) Benjamin Hanser (bwh2124) Mengdi Lin (ml3567)

NewSQL Databases. The reference Big Data stack

GO SHORT INTERVIEW QUESTIONS EXPLAINED IN COLOR

Quick Review of Object-Oriented Programming in Go

05-concurrency.txt Tue Sep 11 10:05: , Fall 2012, Class 05, Sept. 11, 2012 Randal E. Bryant

Motivations History Principles Language Gommunity Success stories Conclusion. Let s Go! A brief introduction to Google s new language.

CS1622. Semantic Analysis. The Compiler So Far. Lecture 15 Semantic Analysis. How to build symbol tables How to use them to find

Don t let data Go astray

GO IDIOMATIC CONVENTIONS EXPLAINED IN COLOR

Go Circuit: Distributing the Go Language and Runtime. Petar Maymounkov

Pace University. Fundamental Concepts of CS121 1

understanding

Distributed Systems. 02r. Go Programming. Paul Krzyzanowski. TA: Yuanzhen Gu. Rutgers University. Fall 2015

New Parallel Programming Languages for Optimization Research

Remote Invocation. To do. Request-reply, RPC, RMI. q Today q. q Next time: Indirect communication

CS 251 Intermediate Programming Java Basics

Go on NetBSD (and pkgsrc!) A modern systems programming language 23 March Benny Siegert Google Switzerland; The NetBSD Foundation

go get my/vulnerabilities Green threads are not eco friendly threads

COMP520 - GoLite Type Checking Specification

Binghamton University. CS-120 Summer Introduction to C. Text: Introduction to Computer Systems : Chapters 11, 12, 14, 13

The PCAT Programming Language Reference Manual

Using the Go Programming Language in Practice

Introduction to the Go Programming Language

Index. object lifetimes, and ownership, use after change by an alias errors, use after drop errors, BTreeMap, 309

go-tutorial Documentation Release latest

RPC and Threads. Jinyang Li. These slides are based on lecture notes of 6.824

Summary of Go Syntax /

OCaml Data CMSC 330: Organization of Programming Languages. User Defined Types. Variation: Shapes in Java

Programming in C. What is C?... What is C?

Programming in C UVic SEng 265

A Fast Review of C Essentials Part I

Programming in C. What is C?... What is C?

Chapter 6 Introduction to Defining Classes

COMP520 - GoLite Type Checking Specification

Python as a First Programming Language Justin Stevens Giselle Serate Davidson Academy of Nevada. March 6th, 2016

Data Acquisition. The reference Big Data stack

Go vs. Swift: The Languages of The Modern Tech Giants

COMP520 - GoLite Type Checking Specification

Communication. Distributed Systems Santa Clara University 2016

Last Class: RPCs. Today:

Pierce Ch. 3, 8, 11, 15. Type Systems

RPCs in Go. COS 418: Distributed Systems Precept 2. Themis Melissaris and Daniel Suo

Arrays and Strings

The Go Programming Language. Part 3

Software Development & Education Center. Java Platform, Standard Edition 7 (JSE 7)

Apache Storm: Hands-on Session A.A. 2016/17

Concurrency in Go 9/22/17

Last Class: RPCs. Today:

SPARK-PL: Introduction

Issue with Implementing PrimeSieve() in Go

Dialects of ML. CMSC 330: Organization of Programming Languages. Dialects of ML (cont.) Features of ML. Functional Languages. Features of ML (cont.

There are, of course, many other possible solutions and, if done correctly, those received full credit.

CS 231 Data Structures and Algorithms, Fall 2016

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 8/19/ Review. Here s a simple C++ program:

Lecture 15: Network File Systems

The Pyth Language. Administrivia

CSci Introduction to Distributed Systems. Communication: RPC

Course May 18, Advanced Computational Physics. Course Hartmut Ruhl, LMU, Munich. People involved. SP in Python: 3 basic points

Homework 6: Spatial Games Due: 11:59pm on Friday, October 30

1 Getting started with Processing

Communication. Overview

ACT-R RPC Interface Documentation. Working Draft Dan Bothell

Final Exam. 11 May 2018, 120 minutes, 26 questions, 100 points

CSCI-GA Scripting Languages

Page 1. Analogy: Problems: Operating Systems Lecture 7. Operating Systems Lecture 7

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

Swift. Introducing swift. Thomas Woodfin

Short Notes of CS201

DOWNLOAD PDF CORE JAVA APTITUDE QUESTIONS AND ANSWERS

PHP Personal Home Page PHP: Hypertext Preprocessor (Lecture 35-37)

Ruby: Introduction, Basics

In the CERTAINTY project, an application is defined as a network of independent processes with the following features:

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 1/9/ Review. Here s a simple C++ program:

Chapter 1 INTRODUCTION SYS-ED/ COMPUTER EDUCATION TECHNIQUES, INC.

CS201 - Introduction to Programming Glossary By

Functions & Variables !

Java Bytecode (binary file)

9/21/17. Outline. Expression Evaluation and Control Flow. Arithmetic Expressions. Operators. Operators. Notation & Placement

Graphical Interface and Application (I3305) Semester: 1 Academic Year: 2017/2018 Dr Antoun Yaacoub

William Kennedy. Brian Ketelsen Erik St. Martin Steve Francia FOREWORD BY MANNING WITH

Last Time: Objects and Abstraction. If it walks like a circle, swims like a circle, and quacks like a circle...!

Transcription:

Università degli Studi di Roma Tor Vergata Dipartimento di Ingegneria Civile e Ingegneria Informatica Introduzione a Go e RPC in Go Corso di Sistemi Distribuiti e Cloud Computing A.A. 2017/18 Valeria Cardellini What is Go? Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. (From https://golang.org) Conceived in September 2007 at Google by R. Griesemer, R. Pike and K. Thompson, and announced in November 2009 Goals of the language and its tools: To be expressive, efficient in both compilation and execution, and effective in writing reliable and robust programs Go s ancestors: mainly C and CSP (communicating sequential processes) formal language by T. Hoare Valeria Cardellini - SDCC 2017/18 1

Go and C Go: C-like language or C for the 21st century From C, Go inherited Expression syntax Control-flow statements Basic data types Call-by-value parameter passing Pointers Emphasis on programs that compile to efficient machine code and cooperate naturally with the abstractions of OSs Valeria Cardellini - SDCC 2017/18 2 Go and other languages New and efficient facilities for concurrency Flexible approach to data abstraction and object-oriented programming Automatic memory management (garbage collection) Valeria Cardellini - SDCC 2017/18 3

Go and distributed systems Go allows you to concentrate on distributed systems problems good support for concurrency good support for RPC garbage-collected (no use after freeing problems) type safe Simple language to learn Valeria Cardellini - SDCC 2017/18 4 References Online Go tutorial https://tour.golang.org/ Go by Examples https://gobyexample.com A. Donovan, B. Kernighan, The Go Programming Language, Addison-Wesley, 2016. Valeria Cardellini - SDCC 2017/18 5

Hello world example package main import "fmt" func main() { fmt.println("hello, ") Valeria Cardellini - SDCC 2017/18 6 Some notes on the first example No semicolon at the end of statements or declarations Go natively handles Unicode Every Go program is made up of packages (similar to libraries or packages) Package: one or more.go source files in a single directory Source file begins with package declaration (which package the file belongs to), followed by list of other imported packages Programs start running in main fmt package contains functions for printing formatted output and scanning input Import statement: groups the imports into a parenthesized, factored statement (see echo example) Valeria Cardellini - SDCC 2017/18 7

Go tool Go is a compiled language Go tool: the standard way to fetch, build, and install Go packages and commands To run the program, use go run $ go run hello-world.go hello, To build the program into binary, use go build $ go build hello-world.go $ ls hello-world* hello-world $./hello-world hello, hello-world.go Valeria Cardellini - SDCC 2017/18 8 Functions A function can take zero or more arguments func add(x int, y int) int { return x + y add takes two parameters of type int The type comes after the variable name Shorter version for the input arguments: func add(x, y int) int { A function can return any number of results func swap(x, y string) (string, string) { return y, x Valeria Cardellini - SDCC 2017/18 9

Variables var statement: declares a list of variables The type is last var statement: can be at package or function level package main import "fmt" var c, python, java bool func main() { var i int fmt.println(i, c, python, java) Can include initializers, one per variable If an initializer is present, the type can be omitted Short variable declaration using := Valeria Cardellini - SDCC 2017/18 10 Types Usual basic types bool, string, int, uint, float32, float64, Type conversion var i int = 42 var f float64 = float64(i) Type inference var i int j := i // j is an int Valeria Cardellini - SDCC 2017/18 11

Flow control statements for, if, else, switch defer Valeria Cardellini - SDCC 2017/18 12 Looping construct Go has only one looping construct: the for loop Three components Init statement Condition expression Post statement sum := 0 for i := 0; i < 10; i++ { sum += i No parentheses surrounding the three components of the for statement and the braces { } are always required Valeria Cardellini - SDCC 2017/18 13

Looping construct Init and post statements are optional: for is Go's "while sum := 1 for sum < 1000 { sum += sum Omit the condition: infinite loop for { Valeria Cardellini - SDCC 2017/18 14 Example: echo // Echo1 prints its command-line arguments. package main import ( ) "fmt" "os" func main() { var s, sep string for i := 1; i < len(os.args); i++ { s += sep + os.args[i] sep = " " fmt.println(s) s and sep initialized to empty strings os.args is a slice of strings (see next slides) Valeria Cardellini - SDCC 2017/18 15

Conditional statements Go's if (and else) statements are like its for loops; expression not surrounded by parentheses ( ) but braces { } are required if v := math.pow(x, n); v < lim { return v } else { fmt.printf("%g >= %g\n", v, lim) Remember that } else must be on the same line Also switch statement Valeria Cardellini - SDCC 2017/18 16 Defer statement New mechanism to defer the execution of a function until the surrounding function returns The deferred call's arguments are evaluated immediately, but the function call is not executed until the surrounding function that contains defer has terminated package main import "fmt" func main() { defer fmt.println("world ) fmt.println("hello") Deferred function calls pushed onto a stack Deferred calls executed in LIFO order hello world Great for things like closing files or connections Valeria Cardellini - SDCC 2017/18 17

Composite data types: pointers and arrays Pointer: holds the memory address of a value var p *int Aggregate data types: structs and arrays Struct: a collection of fields Syntax similar to C, fixed size type Vertex struct { X int Y int Array: type [n]t is an array of n values of type T Fixed size var a [2]string a[0] = "Hello" Valeria Cardellini - SDCC 2017/18 18 Composite data types: slices Slice: dynamically-sized, flexible view into the elements of an array Specify two indices, a low and high bound, separated by a colon: s[i : j] Include first element, but excludes last one primes := [6]int{2, 3, 5, 7, 11, 13 [3 5 7] var s []int = primes[1:4] It is a section of an underlying array: modify the elements of the corresponding array Can be created with the built-in make function New items can be appended to a slice using the built-in append function It s a compile or run-time error to exceed the length (boundschecked) Valeria Cardellini - SDCC 2017/18 19

Composite data types: maps map: maps keys to values Map type map[k]v is a reference to a hash table where K and V are the types of its keys and values Use built-in function make to create a map m = make(map[string]vertex) m["bell Labs"] = Vertex{ 40.68433, -74.39967, You can insert or update an element in a map, retrieve an element, delete an element, test if a key is present Valeria Cardellini - SDCC 2017/18 20 Range range iterates over elements in a variety of data structures range on arrays and slices provides both the index and value for each entry range on map iterates over key/value pairs Valeria Cardellini - SDCC 2017/18 21

Range: example func main() { nums := []int{2, 3, 4 $ go run range.go sum := 0 for _, num := range nums { sum: 9 sum += num index: 1 a -> apple fmt.println("sum:", sum) for i, num := range nums { b -> banana if num == 3 { key: a fmt.println("index:", i) key: b kvs := map[string]string{"a": "apple", "b": "banana" for k, v := range kvs { fmt.printf("%s -> %s\n", k, v) for k := range kvs { fmt.println("key:", k) Valeria Cardellini - SDCC 2017/18 22 Methods Go does not have classes You can define methods on types A method is a function with a special receiver argument (extra parameter before the function name) The receiver appears in its own argument list between the func keyword and the method name type Vertex struct { X, Y float64 func (v Vertex) Abs() float64 { return math.sqrt(v.x*v.x + v.y*v.y) Valeria Cardellini - SDCC 2017/18 23

Interfaces An interface type is defined as a named collection of method signatures Any type (struct) that implements the required methods, implements that interface A type is not explicitly declared to be of a certain interface, it is implicit Just implement the required methods Valeria Cardellini - SDCC 2017/18 24 Interface: example package main import "fmt" import "math" // Here's a basic interface for geometric shapes. type geometry interface { area() float64 perim() float64 // For our example we'll implement this interface on // `rect` and `circle` types. type rect struct { width, height float64 type circle struct { radius float64 Valeria Cardellini - SDCC 2017/18 25

Interface: example // To implement an interface in Go, we just need to // implement all the methods in the interface. Here we // implement `geometry` on `rect`s. func (r rect) area() float64 { return r.width * r.height func (r rect) perim() float64 { return 2*r.width + 2*r.height // The implementation for `circle`s. func (c circle) area() float64 { return math.pi * c.radius * c.radius func (c circle) perim() float64 { return 2 * math.pi * c.radius Valeria Cardellini - SDCC 2017/18 26 Interface: example // If a variable has an interface type, then we can call // methods that are in the named interface. Here's a // generic `measure` function taking advantage of this // to work on any `geometry`. $ go run interfaces.go func measure(g geometry) { fmt.println(g) {3 4 fmt.println(g.area()) 12 fmt.println(g.perim()) 14 func main() { {5 r := rect{width: 3, height: 4 78.53981633974483 c := circle{radius: 5 31.41592653589793 // The `circle` and `rect` struct types both // implement the `geometry` interface so we can use // instances of // these structs as arguments to `measure`. measure(r) measure(c) Valeria Cardellini - SDCC 2017/18 27

Concurrency in Go Go provides concurrency features as part of the core language Goroutines and channels Support CSP concurrency model Can be used to implement different concurrency patterns Valeria Cardellini - SDCC 2017/18 28 Goroutines A goroutine is a lightweight thread managed by the Go runtime go f(x, y, z) starts a new goroutine running f(x, y, z) Goroutines run in the same address space, so access to shared memory must be synchronized Valeria Cardellini - SDCC 2017/18 29

Channels Communication mechanism that lets one goroutine sends values to another goroutine A channel is a thread-safe queue that the Go language and runtime manages for you It does the right thing with blocking threads that read on it, etc. Hides a lot of pain of inter-thread communication Internally, it uses mutexes and semaphores just as one might expect Multiple senders can write to the same channel This is really useful for notifications, multiplexing, etc. And it s totally thread-safe But be careful: only one can close the channel, and can t send after close Valeria Cardellini - SDCC 2017/18 30 Channels A typed conduit through which you can send and receive values using the channel operator <- ch <- v // Send v to channel ch v := <-ch // Receive from ch, and // assign value to v Channels must be created before use ch := make(chan int) Sends and receives block until the other side is ready Goroutines can synchronize without explicit locks or condition variables Data go in the direction of the arrow Valeria Cardellini - SDCC 2017/18 31

Channels: example import "fmt func sum(s []int, c chan int) { sum := 0 for _, v := range s { sum += v c <- sum // send sum to c func main() { s := []int{7, 2, 8, -9, 4, 0 c := make(chan int) go sum(s[:len(s)/2], c) go sum(s[len(s)/2:], c) x, y := <-c, <-c // receive from c fmt.println(x, y, x+y) Valeria Cardellini - SDCC 2017/18 32 More on channels Channels can be buffered Buffer length as the second argument to make to initialize a buffered channel ch := make(chan int, 100) Sends to a buffered channel block only when the buffer is full Receives block when the buffer is empty Close and range on buffers Sender can close a channel Receivers can test whether a channel has been closed by assigning a second parameter to the receive expression v, ok := <-ch ok is false if there are no more values to receive and the channel is closed Use the loop for i := range c to receive values from the channel repeatedly until it is closed Valeria Cardellini - SDCC 2017/18 33

More on channels Select can be used to wait for messages on one of several channels select { case <-ch1: //... case x := <-ch2: //...use x... case ch3 <- y: //... default: //... You can implement timeouts by using a timer channel //to wait 2 seconds timer := time.newtimer(time.second * 2) <- timer.c Valeria Cardellini - SDCC 2017/18 34 Error handling Go code uses error values to indicate abnormal state Errors are communicated via an explicit, separate return value By convention, the last return value of a function nil value in the error position: no error Error handling [in Go] does not obscure the flow of control. (R. Pike) result, err := SomeFunction() if err = nil { // handle the error Built-in error interface type error interface { Error() string errors.new constructs a basic error value with the given error message See https://blog.golang.org/error-handling-and-go Valeria Cardellini - SDCC 2017/18 35

A few more things Go can be somewhat picky Unused variables raise errors, not warnings Use _ for variables you don t care about Unused imports raise errors goimports is a command to automatically add/remove imports https://godoc.org/golang.org/x/tools/cmd/goimports In if-else statements { must be placed at the end of the same line E.g.: } else { E.g.: } else if { gofmt is a command to auto-indent code https://golang.org/cmd/gofmt/ Valeria Cardellini - SDCC 2017/18 36 RPC in Go Go standard library has support for RPC right out-ofthe-box Package net/rpc of the standard Go library https://golang.org/pkg/net/rpc/ Constraints for RPC methods only two arguments are allowed second argument is a pointer an error is always returned func (t *T) MethodName(argType T1, replytype *T2) error Use gob package for parameters marshaling (encode) and unmarshaling (decode) https://golang.org/pkg/encoding/gob/ gob manages streams of gobs (binary values) Valeria Cardellini - SDCC 2017/18 37

On the server side Use Register RPC in Go: server To publish the methods that are part of the given interface on the default RPC server and allows them to be called by clients connecting to the service Use Accept to receive connections on the listener and serve requests for each incoming connection Can also use HTTP handler for RPC messages (see example on the course site) Valeria Cardellini - SDCC 2017/18 38 RPC in Go: client On the client side Use Dial to connect to an RPC server at the specified network address Use Call to invoke the synchronous RPC Use Go to invoke the asynchronous RPC Associated channel will signal when the call is complete Valeria Cardellini - SDCC 2017/18 39

RPC in Go: synchronous call Need some setup in advance of this The method net/rpc/call makes a blocking RPC call // Synchronous call args := &server.args{7,8 var reply int err = client.call("arith.multiply", args, &reply) if err = nil { log.fatal("arith error:", err) fmt.printf("arith: %d*%d=%d", args.a, args.b, reply) func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error Valeria Cardellini - SDCC 2017/18 40 RPC in Go: asynchronous call The method net/rpc/go uses a channel as parameter to retrieve the RPC reply when the call is finished // Asynchronous call quotient := new(quotient) divcall := client.go("arith.divide", args, quotient, nil) replycall := <-divcall.done // will be equal to divcall // check errors, print, etc. func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call For Go s internal implementation, see https://golang.org/src/net/rpc/client.go?s=8029:8135#l284 Valeria Cardellini - SDCC 2017/18 41

Summing up: Two styles of RPC implementations Shallow integration: must use lots of library calls to set things up How to format data Registering which functions are available and how they are invoked Deep integration Data formatting done based on type declarations (Almost) all public methods of object are registered Go is the latter Valeria Cardellini - SDCC 2017/18 42