- 协程可以理解为一种 轻量级的线程
- 从操作系统的角度来看,线程是在 内核态 中调度的,而 协程 是在 用户态 调度的,协程的切换成本更低
- 协程栈比线程栈要小得多,典型的线程栈在1M左右,而协程栈一般在几K或者几十K左右
- 因此无论在时间维度还是在空间维度,协程都比线程轻量很多
-
支持协程的语言:Go、 Python 、 Lua 、Kotlin
- Java OpenSDK的Loom项目的目标是为了支持协程
Go中的协程
func hello(msg string) { fmt.Println("Hello " + msg) } func TestCoroutine(t *testing.T) { // 在新的协程中执行hello方法 go hello("Go") // 等待100毫秒让协程执行结束 time.Sleep(100 * time.Millisecond) }
- Java中的线程是一个重量级对象,因此无法很好地实现Thread-Per-Message模式,而协程可以
- Thread-Per-Message模式非常简单,模式越简单,功能就越稳定,可理解性也越好
echo程序
import ( "log" "net" ) // 使用Thread-Per-Message模式,为每个成功建立连接的Socket分配一个协程 // 相对于 Java 线程池的实现方案,Go协程的方案更简单 func main() { // 监听本地9090端口 socket, err := net.Listen("tcp", "127.0.0.1:9090") if err != nil { log.Panicln(err) } defer socket.Close() for { // 处理连接请求 conn, err := socket.Accept() if err != nil { log.Panicln(err) } // 处理已经成功连接的请求 go handleRqeust(conn) } } // 处理已经成功连接的请求 func handleRqeust(conn net.Conn) { defer conn.Close() for { buf := make([]byte, 1024) // 读取请求数据 size, err := conn.Read(buf) if err != nil { return } // 回写读取到的数据 _, _ = conn.Write(buf[:size]) } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Java并发系列—并发编程基础
- [Java并发-17-并发设计模式] Immutability模式:如何利用不变性解决并发问题?
- JAVA并发编程之并发模拟工具
- Java并发系列—并发编程的挑战
- Core Java 并发:理解并发概念
- [Java并发-11] 并发容器的使用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Letting Go of the Words
Janice (Ginny) Redish / Morgan Kaufmann / 2007-06-11 / USD 49.95
"Redish has done her homework and created a thorough overview of the issues in writing for the Web. Ironically, I must recommend that you read her every word so that you can find out why your customer......一起来看看 《Letting Go of the Words》 这本书的介绍吧!
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
RGB转16进制工具
RGB HEX 互转工具