多线程
文章平均质量分 58
Sirius_7
霍格沃兹在读学生
展开
-
Go语言实现一个简单的并发聊天室
写在前面Go语言在很多方面天然的具备很多便捷性,譬如网络编程,并发编程。而通道则又是Go语言实现并发编程的重要工具,因为其承担着通道之间互相通信的重任。并且因为其本身就是并发安全的,所以在某些场景下是非常好用的。并发聊天服务器这里主要是实现一个简单的并发聊天服务器。首先,客户端可以在服务器中注册自己的信息(登录以及退出),客户端发出的所有的信息由服务器向各个客户端进行转发,或者换句话说是广播。具体代码服务端说的再多,没有代码简单明了,直接上代码~package mainimport (原创 2021-04-26 16:48:30 · 1951 阅读 · 5 评论 -
GO语言多线程实践-3
关于Channel这种GO语言并发原语其实channel已经在另外一篇博客里面有曾经提到过,其使用起来是阻塞的(非buffered),所以比较容易造成dead lock。今天主要总结其两种比较优秀的应用场景:1.生产者和消费者的场景;2.用于替换WaitGroup的场景。生产者和消费者的场景具体代码见下:package mainimport ( "fmt" "math/rand" "time")func main() { c := make(chan int) for i :=原创 2021-03-08 11:27:04 · 135 阅读 · 0 评论 -
GO语言多线程实践-2
实践背景本次实践的背景依然MIT的6.824课程,在课程中lab2需要实现Raft算法,Raft算法的原理细节在我的另外一篇博客中,在这里就不再赘述了。Raft中Leader Election在Raft算法中,当一个节点变为candidate节点之后,其他的节点需要对其进行投票,当其获得超过半数票数时即当选,反之落选。下面将对该过程进行简单的模拟实践。实践思路1.首先向其他节点发送投票请求;2.根据投票请求的结果进行票数计算;3.根据票数的结果,得出投票的结果。那么在第一个步骤中,一定是并发原创 2021-03-04 19:53:29 · 217 阅读 · 2 评论 -
GO语言多线程实践-1
写在前面其实不论是哪一种编程语言,在当下这种大数据的业务压力下,多线程都是重中之重。本文的一些关于go语言的多线程实践都是基于MIT6.824课程总结而来的。多线程通信使用channel通道关于利用channel实现多线程通信的方法,在另外一篇博客中已经提及了,需要注意的主要是其可能造成的死锁问题,本文主要介绍下面这种多线程通信的方式。使用全局变量+锁其实这种方法与channel最大的不同就是,前者是go语言所独有的特性,因为其天然的可以集成多线程并发。这种方法在很多编程语言中都有,譬如Java原创 2021-03-03 11:09:03 · 518 阅读 · 0 评论 -
GO中的Channel以及死锁的造成
写在前面这篇文章的诞生要感谢MIT 6.284课程。在其中一节课中,谈到了多线程的协同的一些问题,其中就涉及到了channel这个概念,并由一段代码引发思考并逐渐深入得到了这篇文章。引子课程中有一段代码如下:其大致含义是:代码背景是在进行多线程网络爬虫页面url,master线程启动后,从channel通道中读取当前页面的所有url即urls,接着再对这个urls中的每一个url进行爬虫读取新页面中的urls(即执行go worker(u, ch ,fetcher)),每启动一个worker线程便原创 2021-01-31 22:19:47 · 407 阅读 · 0 评论 -
Java多线程之两个线程轮流打印
写在前面在整个Java多线程中,线程轮流进行某种操作可以说是非常常见的一种场景,下面以一道实际的场景题为例,进行总结记录。场景需求两个线程轮流打印内容:线程A:A线程B:1线程A:B线程B:2线程A:C线程B:3不多bb,上代码import java.util.ArrayList;/** * 多线程循环打印1A 2B 3C */public class testThread { // 用一个全局变量实现轮流输出的标志位 private static volat原创 2020-07-27 15:52:07 · 1822 阅读 · 1 评论