[go]go并发
同步协程
通过睡眠方法
// 通过睡眠方式等待
time.Sleep(time.Second)
<-time.NewTimer(time.Second).C
<-time.After(time.Second)
// 睡眠100毫秒
select {
case <- time.NewTimer(100 * time.Millisecond).C: // 将在100毫秒可读,返回
}
for {
time.Sleep(10*time.Second)
}
通过WaitGroup同步
// WaitGroup同步: 无需结果
var wg sync.WaitGroup
wg.Add(2)
wg.Done()
wg.Wait() //阻塞等待
通过有缓冲通道同步
// 缓冲为1 的同步
ch := make(chan int, 1)
go func() {
println(1)
ch <- 1
}()
<-ch
println(2)
// 缓冲为10,同步
ch := make(chan int, 10)
for i := 0; i < 10; i++ {
go func() {
println(1)
ch <- i
}()
}
for i := 0; i < cap(ch); i++ {
<-ch
}
//有缓冲通道: 返回无序结果
func main() {
ch := make(chan int, 10)
//开了10个协程让去干活
for i := 0; i < 10; i++ {
go func(i int) {
ch <- i
}(i)
}
//获取10个协程的结果
res := []int{}
for i := 0; i < 10; i++ {
res = append(res, <-ch)
}
//打印10个协程的结果(无序)
fmt.Println(res)
}
// 从100个url获取结果数据, 后集中返回结果(无序)
type User struct {
name string
age int
}
func getUserInfo(resCh chan User, url string) {
resCh <- User{
name: url,
age: 22,
}
println(url)
time.Sleep(time.Second)
}
func main() {
//获取100个用户的信息
var users []User //存放结果数据
urls := []string{
"http://www.1.com",
"http://www.2.com",
"http://www.3.com",
"http://www.4.com",
"http://www.5.com",
}
resCh := make(chan User, len(urls))
defer close(resCh)
for i := 0; i < len(urls); i++ {
go getUserInfo(resCh, urls[i])
}
for i := 0; i < len(urls); i++ {
users = append(users, <-resCh)
}
//打印结果数据
fmt.Println(users)
}
channel
//判断chan关闭
func main() {
ch := make(chan int, 10)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
close(ch)
}()
//for i := 0; i < 10; i++ {
// println(<-ch)
//}
//for {
// i, ok := <-ch
// if !ok {
// break
// }
// println(i)
//}
for v := range ch {
println(v)
}
}
//有缓冲通道: 控制任务并发数
func main() {
ch := make(chan int, 3)
for i := 0; i < 10; i++ {
go func() {
ch <- 1
println("doing")
time.Sleep(time.Second / 3)
<-ch
}()
}
time.Sleep(time.Second)
}
// 管道里有数据即输出: 实现优选返回速度快的
func main() {
ch := make(chan int, 32)
go func() {
time.Sleep(time.Second)
println("google")
ch <- 1
}()
go func() {
time.Sleep(time.Second/2)
println("baidu")
ch <- 1
}()
go func() {
time.Sleep(time.Second/3)
println("bing")
ch <- 1
}()
println(<-ch)
}
select
//select: 实现任务超时
func main() {
ch := make(chan int)
select {
case <-ch:
case <-time.After(time.Second):
println("timeout")
}
}
//select分支随机执行: 实现生成随机数
func main() {
ch := make(chan int)
go func() {
for{
select {
case ch<-0:
case ch<-1:
}
time.Sleep(time.Second/3)
}
}()
for v := range ch {
println(v)
}
}
// select的default分支: 实现goroutine的退出
func main() {
ch := make(chan int)
go func() {
for {
select {
case <-ch://接收退出信号
default: //正常执行
println("hello")
}
time.Sleep(time.Second / 3)
}
}()
time.Sleep(time.Second * 3)
ch <- 1
}
// close chan发广播: 结束多个goroutine
func main() {
ch := make(chan int)
for i := 0; i < 10; i++ {
go func(i int) {
for {
select {
case <-ch: //接收退出信号
default: //正常执行
println("hello", i)
}
time.Sleep(time.Second / 3)
}
}(i)
}
time.Sleep(time.Second * 3)
close(ch)
}
[go]go并发的更多相关文章
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- 多线程的通信和同步(Java并发编程的艺术--笔记)
1. 线程间的通信机制 线程之间通信机制有两种: 共享内存.消息传递. 2. Java并发 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透 ...
- 伪共享(false sharing),并发编程无声的性能杀手
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)
建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...
- 理解Storm并发
作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 注:本文主要内容翻译自understanding-the-parall ...
随机推荐
- 第四章·Kibana入门-安装,索引添加及界面功能
1.Kibana简介及部署 什么是Kibana? Kibana是一个通过调用elasticsearch服务器进行图形化展示搜索结果的开源项目. Kibana安装及配置 #将Kibana安装包上传至服务 ...
- django虚拟环境搭建
windows建立Django项目(建立虚拟环境,安装virtualenv,安装Django,创建项目) 目的:为每一个项目单独配置一个环境例如:项目一使用django1.10, 项目二使用djang ...
- 使用dsoframer演示ppt
优点: (1)不用直接打开PowerPoint (2)可以嵌入到Form中,那种先打开ppt然后将ppt嵌入到Form中的方式,会先打开PowerPoint 缺点: 很早就停止更新了.... 但是没 ...
- 修改Jenkins目录
注意:在Jenkins运行时是不能更改的. 请先将Jenkins停止运行. 1.windows环境下更改JENKINS的主目录 Windows环境中,Jenkins主目录默认在C:\Documents ...
- 【构造 meet in middle 随机 矩阵树定理】#75. 【UR #6】智商锁
没智商了 变式可见:[构造 思维题]7.12道路建设 当你自信满满地把你认为的正确密码输入后,时光机滴滴报警 —— 密码错误.你摊坐在了地上. 黑衣人满意地拍了拍你的肩膀:“小伙子,不错嘛.虽然没解开 ...
- .Net界面开发必备!DevExpress Blazor UI全新组件助力界面开发
行业领先的.NET界面控件DevExpress 正式发布了v19.1版本,DevExpress UI for Blazor/ Razor组件附带7个用户界面组件(包括Data Grid和Pivot G ...
- Linux的SSH免密登录(一)
1.从cp/scp命令出发 scp(secure copy)是linux系统下基于ssh登录进行安全的远程文件拷贝的命令. 1. 传递文件到远程 scp local_file remote_usern ...
- Mybatis的@UpdateProvider注解的使用(转)
废话不多说,直接上代码 @UpdateProvider(type = AppProvider.class, method = "updateApp") Integer update ...
- Java的日期与时间 java.time.Duration (转)
一个Duration对象表示两个Instant间的一段时间,是在Java 8中加入的新功能. 一个Duration实例是不可变的,当创建出对象后就不能改变它的值了.你只能通过Duration的计算方法 ...
- 天刀默认src截图保存文件夹位置在哪里?
C:\Users\Public\Documents\WuXia 注意有的电脑显示的是public documents,实际进去就是documents