Golang创建一百万个轻量级线程并同时执行

进程、进程内的线程和进程内协程(也叫轻量级线程)是一个抽象的概念。

与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建百万个甚至千万个而不会导致系统资源耗尽;而线程和进程通常最多也不能超过一万个。

Go语言在语言级别支持轻量级线程,叫 goroutine,执行时只需要4-5k的内存,比线程更易用,更高效轻便,调度开销更小,可同时运行上千万个并发。

Go语言中的轻量级线程的切换管理不依赖于系统的线程和进程,也不依赖于CPU的核心数量。

Go实现轻量级线程非常简单,下面将展示如何创建一百万个轻量级线程:

package main

import (
	"fmt"
	"runtime"
	"time"
)

var start = make(chan bool)

func main() {
	runtime.GOMAXPROCS(4) //CPU核心数
	for i := 0; i < 1000000; i++ {
		go sayhello(i)
	}
	fmt.Println("一百万个协程创建完毕,60秒后开始同时运行!")
	time.Sleep(time.Second*60)
	close(start)
	time.Sleep(time.Second*60)//主线程Sleep 60秒,确保所有任务全部执行完成。
}

func sayhello(i int) {
	<- start
	fmt.Println("hello",i)
}

上述代码将创建 100万个轻量级goroutine,并同时执行,确保有足够的可用内存哦。

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/p/1112.html

分类: 计算机技术
推荐阅读:
C语言获取整行输入的多种方法 在C语言中,有多种方法可以实现从标准输入流(stdin)中读取整行输入;最常见的方法是使用例如fgets()、scanf()、getchar()这些函数;
Python实现双向链表 在本文中,我们将看到另一种类型的链表,可以向前和向后移动;这样的链接列表称为双重链接列表(双向链表)。
在Rust中如何申请堆内存 在Rust中,可以使用 Box 关键字来在堆上分配内存。Box 是一个智能指针类型,它提供了所有权转移语义,可以将其值分配到堆上,然后通过变量引用进行访问。
PyQt:改变PyQt界面主题风格 Qt不仅功能强大、跨平台,还一个重要的因素是它生成的界面非常漂亮,且可以随意切换主题风格;本文将介绍如何使用Python获取当前系统支持的PyQt界面主题风格,以及如何切换使用它们;
Rust中宏与函数的区别 宏能够接受不同数量和类型的参数,这使得宏在处理多样化的输入时更加灵活。函数具有明确定义的参数列表和返回值类型,参数数量和类型通常是固定的。
SSH证书登录提示WARNING: UNPROTECTED PRIVATE KEY FILE解决方法 使用SSH登录服务器时,出现 WARNING: UNPROTECTED PRIVATE KEY FILE! 提示,其原因是密钥文件权限太开放,SSH要求密钥文件不能被其他用户房访问;