iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang 并发下的问题定位及解决方案
  • 477
分享到

Golang 并发下的问题定位及解决方案

2024-04-02 19:04:59 477人浏览 独家记忆
摘要

目录问题描述解决方案实现思路2.1 通过栈信息解析后获取2.2 修改 Go 源码获取2.3 通过 CGO 获取问题描述 在使用 gin-swagger 的过程中, 经常会发生因为缺少

问题描述

在使用 gin-swagger 的过程中, 经常会发生因为缺少 JSONtag 而导致的异常。 由于 gin-swagger并发执行的, 输出的日志本身是错位的。 这就导致无法定义是哪一个结构体缺少 tag 导致的。

一般而言, 这种时候只能一个个点开去检查。

解决方案

思路 : 要是每行日志带当前 goroutine_id 的话, 是不是就可以准确定位到报错的 goroutine 他打印的日志是哪些了呢!

说做就做

实现思路

  • 查看当前日志是怎么打印的

发现 gin-swagger 日志直接调用的 golang 的标准库 log

由于没有对log初始化, 所以默认使用的是 stdout

log.Printf("Picking operation from %s\n", aurora.Blue(funType.FullName()))
  • 如果想要给日志中添加 goroutine_id 的话, 就需要在调用 log.Printf 的时候获取当前 goroutine 的 id , 所以首先要解决的是怎么获取 goroutine_id 的问题。

调研后发现了集中常见的获取 goroutine_id 的方法:

2.1 通过栈信息解析后获取

func GetGID() uint64 {
    b := make([]byte, 64)
    b = b[:runtime.Stack(b, false)]
    b = bytes.TrimPrefix(b, []byte("goroutine "))
    b = b[:bytes.IndexByte(b, ' ')]
    n, _ := strconv.ParseUint(string(b), 10, 64)
    return n
}

2.2 修改 Go 源码获取

# src/runtime/runtime2.go
func Goid() int64 {
    _g_ := getg()
    return _g_.goid
}

2.3 通过 CGO 获取

文件 id.c

#include "runtime.h"
int64 ·Id(void) {
    return g->goid;
}

文件 id.go

package id
func Id() int64

另外还可以通过汇编获取 goroutine_id

由于go的版本不同,goroutine的结构也可能不同, 所以此处我直接调用一个开源实现:

https://GitHub.com/petermattis/goid

  • 修改 gin-swagger main.go 源码, 修改 log Write 的实现

修改前

func main() {
    cmd.Execute()
}

修改后

type Out os.File
func (o Out) Write(b []byte) (int, error) {
    prefix := fmt.Sprintf("gid-%d: ", goid.Get())
    all := make([]byte, len(b)+len(prefix))
    all = []byte(prefix)
    all = append(all, b...)
    f := os.File(o)
    return f.Write(all)
}
func main() {
    var out Out
    out = Out(os.Stdout)
    log.SetOutput(out)
    cmd.Execute()

这样修改后,每次 gin-swagger 调用 log 打印日志都时候, 都会使用我定义的 Write 方法, Write 方法中每次打印前都会先查询出当前的 goroutine_id ,然后作为日志的前缀。

修改后的日志效果

从中可以看到每行日志开头,都已经加上了 goroutine_id。 只要使用 panic goroutineid 做一次 grep , 即可筛选出需要的日志了,极大的方便了定位问题。

cat /tmp/gin-swagger.log | grep 7647

到此这篇关于Golang 并发下的问题定位的文章就介绍到这了,更多相关Golang并发问题内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang 并发下的问题定位及解决方案

本文链接: https://www.lsjlt.com/news/142590.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang 并发下的问题定位及解决方案
    目录问题描述解决方案实现思路2.1 通过栈信息解析后获取2.2 修改 Go 源码获取2.3 通过 CGO 获取问题描述 在使用 gin-swagger 的过程中, 经常会发生因为缺少...
    99+
    2024-04-02
  • 基于Golang 高并发问题的解决方案
    Golang 高并发问题的解决 Golang在高并发问题上,由于协程的使用,相对于其他编程语言,已经有了很大的优势,即相同的配置上,Golang可以以更低的代价处理更多的线程,同样的...
    99+
    2024-04-02
  • ASP 中常见的并发问题及解决方案
    ASP 中常见的并发问题及解决方案 在 ASP 应用程序中,当多个用户同时访问同一个资源时,会出现并发问题。这些问题会导致应用程序崩溃、数据损坏或数据不一致等严重后果。因此,ASP 开发人员需要了解并发问题的原因和解决方案。 一、并发问题的...
    99+
    2023-11-12
    并发 数据类型 编程算法
  • 分析MySQL并发下的问题及解决方法
    1、背景 对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为了满足这一目标大多数数据库通过锁和事...
    99+
    2024-04-02
  • MySQL 中定位 DDL 被阻塞的问题及解决方案
    DDL 被阻塞了,如何找到阻塞它的 SQL 经常碰到开发、测试童鞋会问,线下开发、测试环境,执行了一个DDL,发现很久都没有执行完,是不是被阻塞了?要怎么解决? 包括在群里,也经常会...
    99+
    2024-04-02
  • 解决Golang Map 并发访问问题的方法
    一分耕耘,一分收获!既然打开了这篇文章《解决Golang Map 并发访问问题的方法》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也...
    99+
    2024-04-04
  • 并发编程中遇到的Python问题及解决方案
    标题:并发编程中遇到的Python问题及解决方案引言:在现代计算机系统中,利用并发编程可以充分发挥多核处理器的性能,提高程序的运行效率。Python作为一种广泛使用的编程语言,也具备了强大的并发编程能力。然而,并发编程中常常会遇到一些问题,...
    99+
    2023-10-22
    解决方案 Python问题 关键词:并发编程
  • Golang开发者应掌握的常见问题及解决方案
    Golang开发者必知的问题及解决方法 Go语言(Golang)作为一门快速、高效、便于并发编程的编程语言,在近年来一直备受开发者青睐。然而,尽管Golang具有许多优点,但在实际开发...
    99+
    2024-02-26
    性能优化 错误处理 并发处理 go语言 golang开发
  • Python中的并行编程问题及解决方案
    Python中的并行编程问题及解决方案,需要具体代码示例随着多核处理器的普及和计算任务的复杂化,以及数据处理方面的需求增加,利用并行编程可以有效地提高程序的执行效率。Python作为一种高级编程语言,具有简洁、易读、易写的特点,也提供了一些...
    99+
    2023-10-22
    解决方案 并行编程 关键词:Python
  • 解决Golang并发工具Singleflight的问题
    目录前言定义用途简单Demo源码分析结构对外暴露的方法重点方法分析Do流程图ForgetdoCall实际使用弊端与解决方案参考文章前言 前段时间在一个项目里使用到了分布式锁进行共享资...
    99+
    2024-04-02
  • golang高并发问题怎么解决
    在Go语言中,高并发问题可以通过以下几种方式来解决: 使用goroutine:Goroutine是Go语言的轻量级线程,可以并发...
    99+
    2024-02-29
    golang
  • 常见绝对定位问题及解决方法详解
    绝对定位故障一览:你应该知道的常见问题及解决方法,需要具体代码示例 摘要:绝对定位是前端开发中经常使用的一种排版方式,但在使用过程中常常会遇到一些问题。本文将介绍几种常见的绝对定位故障,并给出相应的解决方法和具体的代码示例,帮助...
    99+
    2024-01-23
  • Java并发中的ABA问题学习与解决方案
    目录1.简介2.Compare and swap3. ABA问题3.1 ABA问题的实际场景:账户余额修改3.2 账户余额修改时产生的问题4.银行取款问题代码演示5.值类型与引用类型...
    99+
    2024-04-02
  • Windows下ASP程序路径问题及解决方案
    好的,以下是文章内容: 在Windows平台下开发ASP程序时,经常会遇到路径问题,这是因为Windows和Linux等系统在路径处理上存在一定的差异。本文将介绍,并提供实际的演示代码。 一、路径问题的产生原因 1.1 相对路径和绝对路径...
    99+
    2023-09-02
    面试 path windows
  • PHP开发缓存的常见问题及解决方案
    PHP开发缓存的常见问题及解决方案在PHP开发过程中,为了提高网站性能和用户体验,使用缓存是常见的优化手段。然而,使用缓存也会遇到各种问题,本文将介绍PHP开发中常见的缓存问题,并提供相应的解决方案和具体代码示例。一、缓存命中率低问题描述:...
    99+
    2023-11-07
    解决方案 PHP缓存 常见问题
  • Vue.$set 失效的坑 问题发现及解决方案
    偶然在项目中发现Vue.$set失效 有这样一个需求 添加数据过滤用 左边是控件选择 中间是条件 右边是值 因为会根据控件不同渲染不同的值选项控件 <el-for...
    99+
    2024-04-02
  • Go语言的问题及解决方案
    近年来,随着科技的快速发展,Go语言作为一种高效、简洁的编程语言备受关注。然而,就像任何一种编程语言一样,Go语言也存在着一些不容忽视的缺陷。本文将探讨Go语言存在的一些缺陷,并提供解...
    99+
    2024-02-24
    问题 go语言 缺陷 解决之道
  • Java 并发集合中常见的问题与解决方案
    1. 集合修改异常 集合修改异常是指在对集合进行迭代时,集合的内容被修改,导致迭代器失效。这种异常通常发生在多线程环境中,当一个线程正在迭代集合时,另一个线程修改了集合的内容。 解决方案: 使用并发集合:Java 提供了多种并发集合,...
    99+
    2024-02-07
    Java 并发集合 集合修改异常 线程安全 性能 序列化
  • GoLang切片并发安全解决方案详解
    目录1.介绍切片并发问题2.实践检验真理3.回答切片并发安全问题4.解决切片并发安全问题方式5.附1.介绍切片并发问题 关于切片的,Go语言中的切片原生支持并发吗? 2.实践检验真理...
    99+
    2024-04-02
  • Golang的魅力:全面解决问题的方案
    Golang的魅力:一站式解决方案 随着互联网的快速发展,软件开发行业也在不断地发展与变革。在这个动态变化的环境中,选择一个合适的开发语言显得尤为重要。而近年来,Golang(或称为Go)作为一种新兴的编程语...
    99+
    2024-01-20
    Golang 一站式解决方案
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作