golang聊天室的搭建(实现room,群聊,指定room推送)加锁版本

golang制作一个斗地主游戏服务器[10]:房间、桌子、玩家 什么房间那些先暂时不管吧. 最简单的方法就是先快速加入桌子, 也不要准备了. 加入就算自动准备, 断线重连什么的也都不管, 现在的目标就是先跑通流程 一个斗地主房间 (高级场 中级场 初级场, 通常是倍率不同) 里面有很多桌子 package main import "log" // TRoom 房间类 type TRoom struct { } // NewRoo... 阅读详情
package main

import (
   "log"
   "net/http"
   "github.com/gorilla/websocket"
   "sync"
   "fmt"
   "strconv"
   "encoding/json"
)

//定义我们的消息对象
type Message struct {
   Room_id int    `json:"room_id"`
   Uid     int    `json:"uid"`
   Name    string `json:"name"`
   Type    string
   Msg     string
   Price   string //用户出价的价格
   Bdlist  string
}

//var lock sync.Mutex
var lock sync.RWMutex
var room = make(map[int]map[*websocket.Conn]int) //房间的详情
var price = make(map[int]int)                    // 房间的价格
var count = make(map[int]int)                    // 房间实时人数
var broadcast = make(chan Message)               // 创建广播信道

//websocket设置
var upgrader = websocket.Upgrader{
   CheckOrigin: func(r *http.Request) bool {     //允许跨域
      return true
   },
}

//创建web_socket连接
func handleConnections(w http.ResponseWriter, r *http.Request) {
   //将http升级到web_socket
   ws, err := upgrader.Upgrade(w, r, nil)
   if err != nil {
      log.Fatal(err)
   }
   defer ws.Close()
   //监听消息
   //room =>
   //    room_id=>
   //          ws=>uid
   for {
      var msg Message
      //读取json消息,并解析为结构体
      err := ws.ReadJSON(&msg)
      msg.Type = "join"
      //上锁,防止数据的冲突
      lock.Lock()
      //存储信息到对应房间
      if _, ok := room[msg.Room_id]; !ok { //判断该房间是否存在
         //不存在
         mm := make(map[*websocket.Conn]int)
         mm[ws] = msg.Uid
         room[msg.Room_id] = mm
         count[msg.Room_id] = 1
      } else {
         //存在
         room[msg.Room_id][ws] = msg.Uid
         //更新人数
         count[msg.Room_id] += 1
      }
      delete(room, 0)
      lock.Unlock()
      //注册到新客户缓存中
      //读取失败,删除用户
      if err != nil {
         delete(room[msg.Room_id], ws)
         break
      }
      //设置关闭程序(检测断开后的在线人数变化)
      ws.SetCloseHandler(func(code int, text string) error {
         count[msg.Room_id] -= 1
         return nil
      })
      //将新接收的消息发送到广播信道
      broadcast <- msg
   }
}

//全局推送消息
func push() {
   for {
      //从广播频道抓取下一条消息
      msg := <-broadcast
      //获取推送信息
      msginfo := msginfo(&msg)
      //将其发送到当前连接的每个客户端
      //上锁,保证数据
      lock.RLock()
      //对应房间推送
      for k, _ := range room[msg.Room_id] {
         //在本房间的进行推送
         err := k.WriteJSON(msginfo)
         //推送失败,删除数组中的该用户状态
         if err != nil {
            k.Close()
            //fmt.Println("错误的:",room[msg.Room_id][k])
            delete(room[msg.Room_id], k)
            //fmt.Println("删除后:",room)
         }
      }
      //活动结束后,关闭房间
      if msginfo["type"] == "end" {
         delete(room, msg.Room_id)
         delete(count, msg.Room_id)
         delete(price, msg.Room_id)
      }
      lock.RUnlock()
   }
}

//client发送数据组装
func msginfo(m *Message) (msg map[string]interface{}) {
   msg = make(map[string]interface{})
   switch m.Type {
   case "join":
      msg["type"] = "join"                //加入房间
      msg["new_price"] = price[m.Room_id] //最新价格
      msg["number"] = count[m.Room_id]    //最新人数
      msg["name"] = m.Name
      return
   case "start":
      msg["type"] = "start"
      msg["number"] = count[m.Room_id]
      msg["room_id"] = m.Room_id
      price[m.Room_id], _ = strconv.Atoi(m.Price)
      return
   case "change":
      msg["type"] = "change"
      msg["name"] = m.Name
      msg["room_id"] = m.Room_id
      msg["price"] = m.Price
      msg["bdlist"] = m.Bdlist
      price[m.Room_id], _ = strconv.Atoi(m.Price)
   case "end":
      msg["type"] = "end"
      msg["name"] = m.Name
      msg["room_id"] = m.Room_id
      msg["price"] = m.Price
      break
   }
   return
}

//结果
func errors(code int, message string) string {
   data := make(map[string]interface{})
   data["code"] = code
   data["data"] = nil
   data["message"] = message
   datas, _ := json.Marshal(data)
   return string(datas)
}

//开始拍卖
func start(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Content-Type", "application/json;charset=UTF-8")
   new_price := r.PostFormValue("new_price")
   room_id := r.PostFormValue("room_id")
   if len(room_id) > 0 {
      var msg Message
      msg.Type = "start"
      msg.Room_id, _ = strconv.Atoi(room_id)
      msg.Price = new_price
      //将新接收的消息发送到广播信道
      broadcast <- msg
      fmt.Fprintln(w, errors(200, "推送成功"))
   } else {
      fmt.Fprintln(w, errors(403, "缺少参数"))
   }
}

//出价
func change(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Content-Type", "application/json;charset=UTF-8")
   room_id := r.PostFormValue("room_id")
   name := r.PostFormValue("name")
   price := r.PostFormValue("price")
   bdlist := r.PostFormValue("bdlist")
   if len(room_id) > 0 && len(name) > 0 && len(price) > 0 && len(bdlist) > 0 {
      var msg Message
      msg.Type = "change"
      msg.Room_id, _ = strconv.Atoi(room_id)
      msg.Name = name
      msg.Price = price
      msg.Bdlist = bdlist
      //将新接收的消息发送到广播信道
      broadcast <- msg
      fmt.Fprintln(w, errors(200, "推送成功"))
   } else {
      fmt.Fprintln(w, errors(403, "缺少参数"))
   }
}

//结束拍卖
func end(w http.ResponseWriter, r *http.Request) {
   w.Header().Set("Content-Type", "application/json;charset=UTF-8")
   room_id := r.PostFormValue("room_id")
   name := r.PostFormValue("name")
   price := r.PostFormValue("price")
   if len(room_id) > 0 && len(name) > 0 && len(price) > 0 {
      var msg Message
      msg.Type = "end"
      msg.Room_id, _ = strconv.Atoi(room_id)
      msg.Name = name
      msg.Price = price
      //将新接收的消息发送到广播信道
      broadcast <- msg
      fmt.Fprintln(w, errors(200, "推送成功"))
   } else {
      fmt.Fprintln(w, errors(403, "缺少参数"))
   }
}

func main() {
   // 配置Web的路由
   http.HandleFunc("/ws", handleConnections)
   http.HandleFunc("/start", start)
   http.HandleFunc("/change", change)
   http.HandleFunc("/end", end)
   //开始监听传入聊天消息
   go push()
   //在本地主机端口8000启动服务器并记录错误
   log.Println("http server started on :88")
   err := http.ListenAndServe(":88", nil)
   if err != nil {
      log.Fatal("ListenAndServe: ", err)
   }
}
go语言websocket库Gorilla Websocket 类型代表一个Websocket连接,服务端通过在HTTP请求的handler中调用方法得到一个: 通过调用的和方法来发收消息,消息以byte切片存储。下面例子展示了如何用这两个方法实现echo: 上例中:p是[]byte类型。messageType是int型,值可能是或。应用程序也可以使用和接口来发收消息。要想发送消息,先调用的方法得到一个,然后写消息到这个writer,写完消息后close它。要想接收消息,先调用的方法得到一个,然后读直到返回。下面的例子展示如何使用和方法实现echo: 数据类消息 Web 阅读详情

相关推荐

多房间聊天室

后续可根据具体业务需求调整分片数量、通道缓冲大小等参数,建议配合pprof进行性能剖析和针对性优化。每个分片使用独立goroutine并行广播。发送消息时使用select默认分支处理堆积。将用户列表拆分为64个分片,减少锁竞争。支持批量消息处理,减少通道操作次数。使用FNV哈希算法分配用户到分片。默认32个工作者协程处理房间操作。替代原生map+mutex组合。使用原子操作替代部分锁操作。95%消息延迟低于10ms。防止突发流量导致协程暴增。每秒处理20万+ 消息。实时统计全局用户数量。

九班长的博客 147

Golang实战-一个聊天室的实现二

在上一篇《Golang实战-一个聊天室的实现》中,我们按照书上写了个简单的聊天室,今天我们来加点我们自己的东西: 可新增房间,并切换房间。 要想新建房间,得有个房间的对象,保存房间的一些基本信息: type RoomInfo struct { Name string `json:"name"` //删除房间时用,只有房间创建者可删除 CreaterId strin

aslackers的专栏 1762

Go实战--实现一个简单聊天室chatroom(The way to go)

生命不止,继续 go go go !!!上一篇博客跟大家介绍了,如何实现一个简单的tcp服务器和客户端,那么在此基础上,继续深耕一点点,介绍一下如何创建一个聊天室。当然,还是还是一个要有一个服务端和若干个客户端。server net.Listen Accept 这两个方法就不介绍了,之前都有提到过。声明一个net.Conn数组,用于存放连接服务器的客户端:var clients []net.C

一蓑烟雨任平生 也无风雨也无晴 7204

golang 实战 简易聊天室服务(TCP)

room实例本身就是一个房间最新消息版本号+读写锁。客户端读取信息只需要用room的锁上个读锁,获得最新消息后再解锁。写消息也一样(上写锁)。版本号由于向上增长,所以客户端版本号低于房间版本号就会拉取两个版本号之间的信息。我们可能注意到发往客户端时有10毫秒休眠间隔,这个休眠间隔可以设置的小,但不能没有。计算机处理速度很快的现在,别看这里循环有那么几行代码,在计算机面前,嗖的一下就全没了。然后由于太快了,最后接收端缓冲区都还没读,我们就把东西全给别人塞进去了,最后几个独立的包可能被粘成一个了。数据量大的时候

A_super_C的博客 638

Go实战--golang中使用WebSocket实时聊天室(gorilla/websocket、nkovacs/go-socket.io)

生命不止,继续 go go go!!!其实,早就应该跟大家分享golang中关于websocket的使用,但是一直不知道从何入手,也不能够很清晰的描述出来。今天就浅尝辄止,通过第三方库实现websocket。WebSocketWebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 WebSocket通信协

一蓑烟雨任平生 也无风雨也无晴 6万+

Go-golang实现的长连接服务适合基于房间的聊天推送场景

golang实现的长连接服务,适合基于房间的聊天推送场景

[Go WebSocket] 多房间的聊天室(二)代码实现

实现一个多房间的聊天室第二篇。这次官网没有demo了,需要我们自己实现!本篇文章介绍了实现「多房间聊天室」的具体代码实现。

Hull Qin 4605

数字IC时序约束实战:深入解析clock_uncertainty的设置策略与后端影响

本文深入探讨数字IC设计中clock_uncertainty的设置策略及其对后端实现的影响。通过分析时钟不确定度的组成(包括clock_skew、clock_jitter和margin),并结合实际项目经验,详细介绍了在不同设计阶段(综合、布局布线、签核)的动态调整方法。文章还提供了工程化处理参数来源、跨时钟域特殊处理以及优化时序收敛的实用技巧,帮助工程师提升数字IC设计的可靠性和性能。

weixin_29284657的博客 229

2024年Go分布式爬虫笔记(二十二)_extensions randomua(5),最新BAT大厂面试者整理的Golang面试题目

out chan collect.ParseResult //负责处理爬取后的数据,完成下一步的存储操作。workerCh chan *collect.Request //负责分配任务给 worker。requestCh chan *collect.Request //负责接收请求。Pull() *collect.Request //从调度器中获取请求。*collect.Request) //将请求放入到调度器中。Schedule() //启动调度器。

2401_84910848的博客 478

Win11内核隔离无法打开的解决方案详解

内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。

mmoo_python的博客 4829

双脉冲测试中IGBT驱动电阻和驱动电容的研究

  在LTspice中没有双脉冲波形发生器,要做一个双脉冲的波形只能用电压源来进行特殊设置,不是很方便,为此我写了一个双脉冲波形发生器,有需要的可以下载。双脉冲波形发生器。   如下,该元器件可以自定义延迟时间Td,第一个脉冲宽度T1,第二个脉冲宽度T3,两个脉冲间隔T2,脉冲循环个数Ncycle以及高低电平Vhigh,Vlow。       IGBT开通时Rg的影响: 如果增大Rg: ①开通延...

gaoyong_wang的博客 8354

golang怎么搭建Websocket聊天室服务端

收到客户端消息马上发回给客户端go代码解读复制代码。

Maisu的博客 258

PLC控制气缸与电磁阀:从原理到实战编程详解

在工业自动化领域,很多工程师都能编写PLC程序控制电机启停,但当涉及到气缸和电磁阀的精确控制时,却常常遇到动作不协调、响应延迟甚至设备损坏的问题。这背后的关键不在于PLC编程本身,而在于对气动元件特性和控制逻辑的深入理解。 本文将从实际工程问题出发,深入解析气缸与电磁阀的工作原理、PLC控制逻辑设计、常见故障排查方法,并通过完整的梯形图实例,帮助读者掌握气动系统自动化编程的核心要点。无论你是刚接触PLC的初学者,还是希望提升气动控制技能的工程师,都能从中获得实用的技术指导。 1. 气缸与电磁阀在自动化控制中

weixin_42522374的博客 338

Go语言WebSocket与JWT集成实战:构建高并发实时聊天系统

在构建现代Web应用时,实时双向通信是实现在线客服、协同编辑和社交互动的关键技术。传统HTTP协议基于请求-响应模式,难以满足持续、低延迟的数据流需求,而WebSocket协议则提供了真正的全双工通信通道,允许服务器与客户端之间建立持久连接并随时主动推送数据。其技术价值在于显著降低延迟、减少连接开销,尤其适合高并发场景。在身份验证方面,传统的Session/Cookie机制在长连接环境中显得笨拙且难以扩展,JWT(JSON Web Token)作为一种无状态、自包含的令牌方案,通过在连接建立时一次性验证并持

weixin_33910759的博客 432

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 409

华为海思IC设计岗位笔试全解析:物理、电路与工艺三大方向备考指南

本文全面解析华为海思IC设计岗位笔试的物理、电路与工艺三大方向备考要点。针对物理设计方向,重点讲解半导体能带理论、载流子输运机制等核心考点;电路设计方向涵盖Verilog语法、UVM验证等关键技术;工艺方向则深入探讨FinFET工艺、光刻技术等前沿知识。提供高效备考策略和应试技巧,助力考生提升通过率。

weixin_29196613的博客 1085

[Go WebSocket] 多房间的聊天室(一)思考篇

该系列第四篇:实现一个多房间的聊天室。这次官网没有demo了,需要我们自己实现!本篇文章介绍了实现「多房间聊天室」的难点及解决方案。

Hull Qin 4873

L型探测器几何畸变矫正

定位像素空间位置 -> 计算水平面投影点 -> 统一物理分辨率 -> 重采样生成新图。

如果想成为中心,那么就到中心去吧。 242

从0开始的go+websocket构建五子棋对战系统

基本框架 直接照搬,不多解释。 dao为数据库处理层 po为实体类 middleware为中间件,cors处理跨域 app对request请求进行封装 router处理路由 service为服务层,进行数据处理逻辑 网络框架 使用gin作为整体的网络框架,文档在这里https://github.com/gin-gonic/gin //main.go func main() { engine :...

wxyww2049的博客 126

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

丨汀、的博客 4万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Go语言开发IM与推送业务

背景简介: 前VMware云平台首席技术官Derek Collison曾断言Go语言两年内将成为云计算的主流语言,这也许有些耸人听闻,但Go语言在Google内部确实取得了令人瞩目的成绩。Wired最近发表文章讲述了Go语言在Google内部崛起的故事,IT经理网编译整理如下: 当一部分“老弱”程序代码不能正常工作时,Google就会派出负责Go语言项目的“地鼠特工队”负责除旧迎新。 Bra

jsmeli的博客 3715

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

手把手教姐姐写消息队列(golang)- 使用channel实现消息队列

前言 这周姐姐入职了新公司,老板想探探他的底,看了一眼他的简历,呦呵,精通kafka,这小姑娘有两下子,既然这样,那你写一个消息队列吧。因为要用go语言写,这可给姐姐愁坏了。赶紧来求助我,我这么坚贞不屈一人,在姐姐的软磨硬泡下还是答应他了,所以接下来我就手把手教姐姐怎么写一个消息队列。下面我们就来看一看我是怎么写的吧~~~。 本代码已上传到我的github: 有需要的小伙伴,可自行下载,顺便给个小星星吧~~~ 什么是消息队列 姐姐真是把我愁坏了,自己写的精通kafka,竟然不知道什么是消息队列,于是

qq_39397165的博客 5937

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[Go WebSocket] 多房间的聊天室(六)为什么要加锁?不加锁行不行啊?

本文通过编写测试用例,回答以下问题:为什么一定要加锁?加锁后,你的代码逻辑是对的吗?换个描述方法:本文论证了给代码逻辑加锁的必要性和充分性。

Hull Qin 4604

golang游戏服务器框架_Go语言实现的流媒体服务器开发框架

Monibuca​monibuca.com背景市面上的流媒体服务器不可谓不多,从本人的第一份工作起,就一直接触和研究了形形色色的流媒体服务器,从最早的FCS(全称Flash Communication Server),后来改名为FMS(全称Flash Media Server),到Red5(java语言开发),到CrtmpServer(C++开发),让我对流媒体服务器的基本原理有了深刻的认识。当时...

weixin_39826984的博客 871

golang设计模式——享元模式

享元模式充分说明了抽象的重要性,希望大家能够善用这种模式,优化系统。

qq_53267860的博客 441

Go语言学习笔记【8】 实现聊天系统[二](B站视频)

go语言实现聊天系统(2)

LC520730的博客 1165
上一篇: golang基础-互斥锁、读写锁
下一篇: linux下对golang的安装
yí無所冇
博客等级 码龄9年 78粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值