1. 程式人生 > >gin 協程併發導致服務停止

gin 協程併發導致服務停止

問題程式碼:

func load(c *gin.Context){
    go func(c *gin.Context){
        c.GetString(....)
    }(c)
    go func(c *gin.Context){
        c.Set(...)
    }(c)
}

導致服務偶發性停止,對外表現為:某臺例項服務的某一分鐘出現大量502且200流量降低接近0。
檢視日誌:
fatal error: concurrent map read and map write
意思是併發對map進行讀寫產生錯誤

分析:

問題程式碼,對gin.Context變數進行讀寫。

type Context struct {
    writermem responseWriter
    Request   *http.Request
    Writer    ResponseWriter

    Params   Params
    handlers HandlersChain
    index    int8

    engine *Engine

    // Keys is a key/value pair exclusively for the context of each request.
    Keys map[string]interface
{} // Errors is a list of errors attached to all the handlers/middlewares who used this context. Errors errorMsgs // Accepted defines a list of manually accepted formats for content negotiation. Accepted []string } func (c *Context) Set(key string, value interface{}) { if c.Keys == nil
{ c.Keys = make(map[string]interface{}) } c.Keys[key] = value }

當呼叫set方法的時候,並沒有進行讀寫鎖的併發控制,所以在某些場景下,會產生鎖競爭的問題。

解決方法:

序列對gin.Context的讀寫,channel控制set操作,或者直接獨立到go函式外面單獨執行。

相關推薦

gin 併發導致服務停止

問題程式碼: func load(c *gin.Context){ go func(c *gin.Context){ c.GetString(....) }(c) go func(c *gin.Context){

在Web服務器中的應用(配的圖還不錯)

via 進程 應用 lib 協程 解決方案 多個 微線程 變量 協程(纖程,微線程)這個概念早就有之,各家互聯網公司也都有研究,但在國內各大論壇和大會熱起來,還是今年的事。 最近參與討論開放平臺建設和架構設計過程中,有同事提到了使用協程代替線程,能

針對惠普伺服器SNMP採集頻繁,導致服務停止的解決方案

運維軟體:zabbix採集方式:snmp採集裝置:惠普-DL380_Gen9-伺服器採集週期:根據指標要求頻率有5分鐘到1天主要命令:reset /map1樂維服務中發現,snmp採集惠普伺服器一段時間後,zabbix提示連線失敗,重啟ilo後又可以重新採集,我們可以利用這一點做一

python3併發

# 程序是資源分配的單位 # 執行緒是作業系統排程的單位 # 程序切換需要的資源最大,效率低 # 執行緒切換需要的資源一般,效率一般 # 協程切換任務資源很小,效率高 # 多程序、多執行緒根據cpu核數不一樣可能是並行的,但是協成在一個執行緒中 #協程,自動切換 import gevent,time

python3多程序 程序池 併發

一、程序            我們電腦的應用程式,都是程序,程序是資源分配的單位。程序切換需要的資源最大,效率低。         程序之間相互獨立

【SNMP採集】解決方案——惠普伺服器SNMP採集頻繁導致服務停止

  運維軟體:zabbix 採集方式:snmp 採集裝置:惠普-DL380_Gen9-伺服器 採集週期:根據指標要求頻率有5分鐘到1天 主要命令:reset /map1 snmp採集惠普伺服器一段時間後,zabbix提示連線失敗,重啟ilo後又可以重新採集,我

python使用併發

協程 協程是一種使用者態的輕量級執行緒,又稱微執行緒。 協程擁有自己的暫存器上下文和棧,排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。因此:協程能保留上一次呼叫時的狀態(即所有區域性狀態的一個特定組合),每次過程重入時,就相當於進入上一次呼叫的狀態,換種說法:進

測試go多併發寫入記憶體和磁碟對效能的影響

最近希望能把一些過程,由傳統的順序執行改變成併發執行,看這樣的優化是否能帶來效能的提高。於是寫了幾個test來測試帶來的影響。 測試的環境為mac pro,2.3 GHz Intel Core i5(雙核),16GB記憶體。 (1)先測試併發寫入記憶體是否能夠得到效能的提高

Unity在內部停止自身後代碼執行問題

num png urn cor art turn oid col 測試 當在協程內部停止自身後,後面的代碼塊還會繼續執行,直到遇到yield語句才會終止。 經測試:停止協程,意味著就是停止yield,所以在停止協程後,yield之後的語句也就不會執行了。 代碼如下: 1

skynet服務的威力

解釋 -- unp eat 函數 prototype blue p s err ????接上一篇分析《skynet服務之launcher》,本篇我們繼續來分析一下lua中的協程如何與服務有機結合的,關於lua中協程的解釋參見本文《lua中協程的理解》; 上一篇分析到,當一

python-圖形化界面編(一個啟動停止服務的界面)

python-圖形化界面編程(一個啟動停止服務的界面)GUI編程1. Python實現GUI的方法1)使用python的標準庫 Tkinter2)使用wxPython3)使用Jython(可以和 Java無縫集成)2. 使用Tkinter安裝tkinter庫yum install -y tkinter t

python 64式: 第4式、eventlet實現併發

#!/usr/bin/env python # -*- coding: utf-8 -*- from datetime import datetime import eventlet eventlet.monkey_patch(all=True) from eventlet.green

15.python併發程式設計(執行緒--程序--)

一.程序:1.定義:程序最小的資源單位,本質就是一個程式在一個數據集上的一次動態執行(執行)的過程2.組成:程序一般由程式,資料集,程序控制三部分組成:(1)程式:用來描述程序要完成哪些功能以及如何完成(2)資料集:是程式在執行過程中所需要使用的一切資源(3)程序控制塊:用來記錄程序外部特徵,描述程序的執行變

Python併發程式設計系列之

1 引言 2 協程的意義   2.1 什麼是協程   2.2 協程的作用   2.3 相關概念 3 定義協程 4 使用協程   4.1 單個協程   4.2多協程併發   4.3 獲取返回值   4.4 繫結回撥函式   4.5 協程的巢狀使用 5 總結   1 引言

一段小程式淺析Go中的併發(goroutine),sync.WaitGroup

package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(2) fmt.Println("begin typing") var wg sync.WaitGro

python併發

在作業系統中程序是資源分配的最小單位, 執行緒是CPU排程的最小單位。 協程:是單執行緒下的併發,又稱微執行緒,纖程。英文名Coroutine。一句話說明:協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的。也就是說程式設計師用程式碼來控制切換. 參考: http://www.cnblo

RapPhp 3.0.1 釋出:新增 Swoole 版的連線池技術和 Rpc 服務

   Rap 最近釋出重大版本了 隨著 swoole 升級4.0 ,我們全面使用 協程模式,讓程式飛起來 本次主要新增加的新特性包含 1.資料庫連線池 2.redis連線池 3.Rpc 服務端,客戶端(連線池),熔斷器,服務降級 4.redis 分散式鎖 5.websocket

PHP併發 shell_exec

在PHP程式中經常需要用shell_exec執行一些命令,而普通的shell_exec是阻塞的,如果命令執行時間過長,那可能會導致程序完全卡住。在Swoole4協程環境下可以用Co::exec併發地執行很多命令。 本文基於 Swoole-4.2.9和 PHP-7.2.9版本 協程示例 &

單執行緒實現併發——,gevent模組

一 併發的本質     1 切換   2 儲存狀態 二 協程的概念   協程,又稱微執行緒,纖程。英文名Coroutine。單執行緒下實現併發,使用者從應用程式級別控制單執行緒下任務的切換,注意一定是遇到I/O才切。   協程的特點在於是一個執行緒執行,那和多執行緒比,協程有何優勢?  

python--asyncio模組(基礎併發測試)

在高併發的場景下,python提供了一個多執行緒的模組threading,但似乎這個模組並不近人如意,原因在於cpython本身的全域性解析鎖(GIL)問題,在一段時間片內實際上的執行是單執行緒的。同時還存在著資源爭奪的問題。python3.4之後引入了基於生成器物件的協程概念。也就是asyncio模組。除了