6 changed files with 242 additions and 104 deletions
@ -1,47 +1,94 @@ |
|||
/* |
|||
Landesamt für Geoinformation und Landentwicklung, Referat 35 |
|||
Einführung in die Sprache Go, 25.7.2017 |
|||
Lektion 10: Ganz einfacher Webserver |
|||
Lektion 10: Performancesteigerung durch Go-Nebenläufigkeit (Routinen und Prozesse) |
|||
*/ |
|||
package main |
|||
|
|||
import ( |
|||
"fmt" |
|||
"net/http" |
|||
"math" |
|||
"runtime" |
|||
"strconv" |
|||
"sync" |
|||
"time" |
|||
) |
|||
|
|||
func handler00(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintf(w, "Guckuck %s!", r.URL.Path[1:]) |
|||
fmt.Println(r.URL) |
|||
} |
|||
var ( |
|||
maxThreads, maxRoutines int8 |
|||
|
|||
func handler01(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintf(w, `<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<meta charset="UTF-8"/> |
|||
<title>Testseite 01</title> |
|||
</head> |
|||
<body>Du befindest Dich auf Seite `+"%s!"+`</body> |
|||
</html>`, r.URL.Path[1:]) |
|||
} |
|||
gesuchteZahl int = 8978793242417717171 |
|||
timestamp [2]int64 |
|||
) |
|||
|
|||
const ThreadFaktor int8 = 4 //!
|
|||
|
|||
var wg sync.WaitGroup |
|||
|
|||
func is_prime(n *int) bool { |
|||
if *n == 2 { // 2 ist die einzige gerade Primzahl
|
|||
return true |
|||
} else if *n < 2 || *n&1 == 0 { // falls zahl < 2 oder gerade Zahl -> keine Primzahl (1 keine Primzahl)
|
|||
return false |
|||
} else { |
|||
var reportChannel, stopChannel chan bool = make(chan bool, maxRoutines), make(chan bool, maxRoutines-1) |
|||
|
|||
func handler02(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintf(w, `<?xml version='1.0' encoding='iso-8859-1'?> |
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd"> |
|||
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de"> |
|||
<head> |
|||
<meta charset="UTF-8"/> |
|||
<title>Testseite 01</title> |
|||
</head> |
|||
<body><b>Du</b> befindest Dich jetzt auf <i>Seite `+"%s!"+`</i></body> |
|||
</html>`, r.URL.Path[1:]) |
|||
maxSchleife := int(math.Sqrt(float64(*n))) |
|||
|
|||
for start := int8(3); start <= 3+(maxRoutines-1)*2; start += 2 { |
|||
wg.Add(1) |
|||
go func(s int8, e, g *int, mf *int8, cr, cs chan bool) { |
|||
defer wg.Done() |
|||
select { |
|||
case <-cs: // Heh, Ihr könnt aufhören
|
|||
return |
|||
default: |
|||
for i := int(s); i <= *e; i += int(*mf) * 2 { |
|||
//fmt.Println(i)
|
|||
if *g%i == 0 { |
|||
select { |
|||
case cr <- true: |
|||
default: |
|||
fmt.Println("Channel voll!") |
|||
} |
|||
return |
|||
} |
|||
} |
|||
} |
|||
cr <- false |
|||
}(start, &maxSchleife, n, &maxRoutines, reportChannel, stopChannel) |
|||
} |
|||
|
|||
select { |
|||
case cvalue, cstatus := <-reportChannel: |
|||
if cstatus && cvalue == true { |
|||
for i := int8(1); i < maxRoutines; i++ { // 1 to < maxThreads ist effizienter als 0 to < maxThreads-1
|
|||
stopChannel <- true |
|||
} |
|||
wg.Wait() |
|||
close(reportChannel) |
|||
close(stopChannel) |
|||
return false |
|||
} |
|||
} |
|||
return true |
|||
} |
|||
} |
|||
|
|||
func main() { |
|||
maxThreads = int8(runtime.NumCPU()) //!
|
|||
maxRoutines = maxThreads * ThreadFaktor |
|||
runtime.GOMAXPROCS(int(maxThreads)) |
|||
|
|||
timestamp[0] = time.Now().UnixNano() |
|||
|
|||
if is_prime(&gesuchteZahl) == true { |
|||
fmt.Println(strconv.Itoa(gesuchteZahl) + " IST eine Primzahl") |
|||
} else { |
|||
fmt.Println(strconv.Itoa(gesuchteZahl) + " ist KEINE Primzahl") |
|||
} |
|||
|
|||
timestamp[1] = time.Now().UnixNano() |
|||
|
|||
http.HandleFunc("/", handler00) |
|||
http.HandleFunc("/aa", handler01) |
|||
http.HandleFunc("/bb", handler02) |
|||
http.ListenAndServe(":8080", nil) |
|||
fmt.Printf("\nProzess ist fertig und hat mit %v Routinen, verteilt auf %v Threads, %v Sekunden gedauert!\n\n", maxRoutines, maxThreads, (float64(timestamp[1]-timestamp[0]) * math.Pow(10, -9))) |
|||
} |
|||
|
@ -1,78 +1,47 @@ |
|||
/* |
|||
Landesamt für Geoinformation und Landentwicklung, Referat 35 |
|||
Einführung in die Sprache Go, 25.7.2017 |
|||
Lektion 11: Ein simpler Listener |
|||
Lektion 11: Ganz einfacher Webserver |
|||
*/ |
|||
package main |
|||
|
|||
import ( |
|||
"bytes" |
|||
"fmt" |
|||
"io" |
|||
"log" |
|||
"net" |
|||
"strconv" |
|||
"strings" |
|||
"net/http" |
|||
) |
|||
|
|||
const ( |
|||
constNET_PROTOCOL = "tcp" |
|||
constNET_PORT = 1234 |
|||
) |
|||
|
|||
type dasOhr struct { |
|||
dasGehörte *string |
|||
} |
|||
|
|||
func (f dasOhr) Write(b []byte) (int, error) { |
|||
//fmt.Println(*f.dasGehörte, string(b))
|
|||
*f.dasGehörte = string(b) |
|||
return len(strings.TrimSpace(string(b))), nil |
|||
func handler00(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintf(w, "Guckuck %s!", r.URL.Path[1:]) |
|||
fmt.Println(r.URL) |
|||
} |
|||
|
|||
func Concatstring(args ...string) string { |
|||
var buffer bytes.Buffer |
|||
for _, v := range args { |
|||
buffer.WriteString(v) |
|||
} |
|||
return buffer.String() |
|||
func handler01(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintf(w, `<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<meta charset="UTF-8"/> |
|||
<title>Testseite 01</title> |
|||
</head> |
|||
<body>Du befindest Dich auf Seite `+"%s!"+`</body> |
|||
</html>`, r.URL.Path[1:]) |
|||
} |
|||
|
|||
type Concatablestring string |
|||
|
|||
func (f *Concatablestring) Join(args ...string) string { |
|||
var buffer bytes.Buffer |
|||
buffer.WriteString(string(*f)) |
|||
for _, v := range args { |
|||
buffer.WriteString(v) |
|||
} |
|||
return buffer.String() |
|||
func handler02(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintf(w, `<?xml version='1.0' encoding='iso-8859-1'?> |
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd"> |
|||
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de"> |
|||
<head> |
|||
<meta charset="UTF-8"/> |
|||
<title>Testseite 01</title> |
|||
</head> |
|||
<body><b>Du</b> befindest Dich jetzt auf <i>Seite `+"%s!"+`</i></body> |
|||
</html>`, r.URL.Path[1:]) |
|||
} |
|||
|
|||
func main() { |
|||
|
|||
bb := dasOhr{new(string)} |
|||
|
|||
//gsocks := Concatstring(":", strconv.Itoa(constNET_PORT)) // Lausche an TCP port 1234
|
|||
var javaLoversLikeObjekts Concatablestring = ":" |
|||
gsocks := javaLoversLikeObjekts.Join(strconv.Itoa(constNET_PORT)) |
|||
|
|||
l, err := net.Listen(constNET_PROTOCOL, gsocks) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
defer l.Close() |
|||
for { |
|||
// Warte auf eine Connection
|
|||
conn, err := l.Accept() |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
|
|||
//io.CopyBuffer(tt, conn, make([]byte, 18))
|
|||
io.Copy(bb, conn) |
|||
fmt.Print("Televisor meldet: ", *bb.dasGehörte) |
|||
fmt.Printf("Dieses Gedankenverbrechen wurde präsentiert von %v\n", conn.RemoteAddr()) |
|||
conn.Close() |
|||
} |
|||
http.HandleFunc("/", handler00) |
|||
http.HandleFunc("/aa", handler01) |
|||
http.HandleFunc("/bb", handler02) |
|||
http.ListenAndServe(":8080", nil) |
|||
} |
|||
|
@ -0,0 +1,78 @@ |
|||
/* |
|||
Landesamt für Geoinformation und Landentwicklung, Referat 35 |
|||
Einführung in die Sprache Go, 25.7.2017 |
|||
Lektion 12: Ein simpler Listener |
|||
*/ |
|||
package main |
|||
|
|||
import ( |
|||
"bytes" |
|||
"fmt" |
|||
"io" |
|||
"log" |
|||
"net" |
|||
"strconv" |
|||
"strings" |
|||
) |
|||
|
|||
const ( |
|||
constNET_PROTOCOL = "tcp" |
|||
constNET_PORT = 1234 |
|||
) |
|||
|
|||
type dasOhr struct { |
|||
dasGehörte *string |
|||
} |
|||
|
|||
func (f dasOhr) Write(b []byte) (int, error) { |
|||
//fmt.Println(*f.dasGehörte, string(b))
|
|||
*f.dasGehörte = string(b) |
|||
return len(strings.TrimSpace(string(b))), nil |
|||
} |
|||
|
|||
func Concatstring(args ...string) string { |
|||
var buffer bytes.Buffer |
|||
for _, v := range args { |
|||
buffer.WriteString(v) |
|||
} |
|||
return buffer.String() |
|||
} |
|||
|
|||
type Concatablestring string |
|||
|
|||
func (f *Concatablestring) Join(args ...string) string { |
|||
var buffer bytes.Buffer |
|||
buffer.WriteString(string(*f)) |
|||
for _, v := range args { |
|||
buffer.WriteString(v) |
|||
} |
|||
return buffer.String() |
|||
} |
|||
|
|||
func main() { |
|||
|
|||
bb := dasOhr{new(string)} |
|||
|
|||
//gsocks := Concatstring(":", strconv.Itoa(constNET_PORT)) // Lausche an TCP port 1234
|
|||
var javaLoversLikeObjekts Concatablestring = ":" |
|||
gsocks := javaLoversLikeObjekts.Join(strconv.Itoa(constNET_PORT)) |
|||
|
|||
l, err := net.Listen(constNET_PROTOCOL, gsocks) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
defer l.Close() |
|||
for { |
|||
// Warte auf eine Connection
|
|||
conn, err := l.Accept() |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
|
|||
//io.CopyBuffer(tt, conn, make([]byte, 18))
|
|||
io.Copy(bb, conn) |
|||
fmt.Print("Televisor meldet: ", *bb.dasGehörte) |
|||
fmt.Printf("Dieses Gedankenverbrechen wurde präsentiert von %v\n", conn.RemoteAddr()) |
|||
conn.Close() |
|||
} |
|||
} |
Loading…
Reference in new issue