分享
  1. 首页
  2. 文章

go 圣经 摘抄

SongLiang · · 1465 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Chapter 8 Goroutines and Channels

Go enable two styles of concurrent programming. This chapter presents coroutines and channels, which support communicating sequential processes or CSP, a model of concurrency in which values are passed between independent activities (goroutines) but variables are for the the most part confined to a single activity. Chapter 9 covers some aspects of the more traditional model of shared memory multithreading, which will be familiar if you've used threads in other mainstream languages. Chapter 9 also points out some important hazards and pitfalls of concurrent programming that we won't delve into in this chapter.
goroutine 两种模式,一种用于两个 goroutine 之间的交流,variables 被限定在一个单独的 activities。
另一种类似于其他主流语言的多线程,特点是 shared memory multithreading。

8.1 Goroutines

In Go, each concurrently executing activity is called a goroutine.
golang中,每个并发执行的 activity 被称为 goroutine。

If you have used operating system threads or threads in other languages, then you can assume for now that a goroutine is similar to a thread, and you'll be able to write correct programs. The differences between threads and goroutines are essentially quantitative, not qualitative, and will be described in Section 9.8.
threads 与 goroutines 的区别是定量的,而非定性的。在9.8中讲会进行进一步的解释。

When a program starts, its only goroutine is the one that calls the main function, so we call it the main goroutine. New goroutines are created by the go statement. Syntactically, a go statement is an ordinary function or method call prefixed by the keyword go. A go statement causes the function to be called in a newly created goroutine. The go statement itself completes immediately:
当一个程序启动后,程序唯一的main function 就是 main goroutine。

  • f()
  • go f()
package main
import (
 "time"
 "fmt"
)
func main() {
 go spinner(5 * time.Millisecond)
 const n = 45
 fibN := fib(n)
 fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
}
func spinner(delay time.Duration) {
 for {
 for _, r := range `-\|/` {
 fmt.Printf("\r%c", r)
 time.Sleep(delay)
 }
 }
}
func fib(x int) int {
 if x < 2 {
 return x
 }
 return fib(x - 1) + fib(x - 2)
}

程序里的 /r 表示回车

Other than by returning from main or exiting the program, there is no programmatic way for one goroutine to stop another, but as we will see later, there are ways to communicate with a goroutine to request that it stop itself.
除了从 main 函数返回 或者 退出当前的程序,没有程序上的办法能让一个 goroutine 来停止另一个 goroutine,但是有办法让一个 goroutine 向另一个 goroutine 发送消息,让他自己停止下来。

8.2 Example: Concurrent Clock Server

一个时钟例子
服务器

package main
import (
 "net"
 "log"
 "io"
 "time"
)
func main() {
 listener, err := net.Listen("tcp", "localhost:8000")
 if err != nil {
 log.Fatal(err)
 }
 for {
 conn, err := listener.Accept()
 if err != nil {
 log.Print(err)
 continue
 }
 handleConn(conn)
 }
}
func handleConn(c net.Conn) {
 defer c.Close()
 for {
 _, err := io.WriteString(c, time.Now().Format("15:04:05\n"))
 if err != nil {
 return
 }
 time.Sleep(1 * time.Second)
 }
}

重要的是三步:

  • listener, err := net.Listen("tcp", "localhost:8000")
  • conn, err := listener.Accept()
  • _, err := io.WriteString(c, time.Now().Format("15:04:05\n"))
    注释:采用的时间必须是 2016年1月2日 15:04:05 (123456) 一月二号 三点四分五秒
    https://segmentfault.com/q/1010000010976398/a-1020000010982052
    在客户端采用 nc 命令连接
    nc localhost 8000
    客户端
package main
import (
 "net"
 "log"
 "io"
 "os"
)
func main() {
 conn, err := net.Dial("tcp", "localhost:8000")
 if err != nil {
 log.Fatal(err)
 }
 defer conn.Close()
 _, err1 := io.Copy(os.Stdout, conn)
 if err != nil {
 log.Fatal(err1)
 }
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:SongLiang

查看原文:go 圣经 摘抄

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1465 次点击
1 回复 | 直到 2025年05月11日 10:08:00
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏