草庐IT

go - Golang在TCP上死锁。一段时间后写入

coder 2024-07-13 原文

我有这个测试代码。
一段时间后,所有gorutines都会锁定carbonwritebuf.flush()而不会出现任何错误。停下来。
线程越多,间隔越短,停止越快。
如果我杀死接收到的应用程序(NC-L 127.0.0.1 2002-K-M 1000),Golang会重置连接并再次工作。但是,如果gorutine已经停止,那么就没有重启和任何消息。

package main

import (
    "bufio"
    "flag"
    "fmt"
    "net"
    "time"
)

var (
    SERVER   string
    INTERVAL int
    THREADS  int
)

func main() {
    flag.StringVar(&SERVER, "s", "localhost:2002", "server address:port (Default: localhost:2002)")
    flag.IntVar(&INTERVAL, "i", 500, "send interval (Default: 500")
    flag.IntVar(&THREADS, "t", 100, "num of threads (Default: 100")
    flag.Parse()

    for i := 0; i < THREADS; i++ {
        go sender(i)
    }

    for {
    }
}

func sender(id int) {
    var carbonErr error
    var carbonWriteBuf *bufio.Writer
    var carbonConn net.Conn
    defer fmt.Println("End 1")
    x := 0

    i := 10
    isUp := true

    updater := time.NewTicker(time.Duration(INTERVAL*3) * time.Millisecond)
    go func() {
        defer fmt.Println("End 2")
        for range updater.C {
            if isUp {
                i++
            } else {
                i--
            }

            if i == 20 {
                isUp = false
            }

            if i == 0 {
                isUp = true
            }
            fmt.Println(x)
        }
    }()

    dataSender := time.NewTicker(time.Duration(INTERVAL) * time.Millisecond)
    func() {
        defer fmt.Println("End 3")
        for range dataSender.C {
            x++
            if carbonConn != nil {
                //carbonConn.SetWriteDeadline(time.Now().Add(time.Second * 3))
                if err := carbonConn.SetDeadline(time.Now().Add(time.Second * 3)); err != nil {
                    fmt.Println("Cannot set deadline", err)
                }
                if _, writeErr := carbonWriteBuf.WriteString(fmt.Sprintf("test.%d.value %d %d\n", id, i, time.Now().Unix())); writeErr == nil {
                    fmt.Println("Buffered:", carbonWriteBuf.Buffered())

                    if flushErr := carbonWriteBuf.Flush(); flushErr == nil {
                        fmt.Println("Send", time.Now().Unix())
                    } else {
                        fmt.Printf("Cannot write data to carbon %s Error: %s\n", carbonConn.RemoteAddr(), flushErr)
                        carbonConn = nil
                    }
                } else {
                    fmt.Println("Cannot write data to buffer:", writeErr)
                    carbonConn = nil
                }
            } else {
                if carbonConn, carbonErr = net.Dial("tcp", SERVER); carbonErr != nil {
                    carbonConn = nil
                    fmt.Println("Cannot connect to carbon:", carbonErr)
                } else {
                    defer carbonConn.Close()
                    carbonWriteBuf = bufio.NewWriterSize(carbonConn, 4096)
                    //carbonWriteBuf = bufio.NewWriter(carbonConn)
                    fmt.Println("Successfully connected to carbon:", carbonConn.RemoteAddr())
                }
            }
        }
    }()
}

最佳答案

主线程中的忙循环出现问题。谢谢吉姆

关于go - Golang在TCP上死锁。一段时间后写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50876267/

有关go - Golang在TCP上死锁。一段时间后写入的更多相关文章

  1. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  2. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  3. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  4. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  5. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  6. ruby - Ruby 是否使用 $stdout 来写入 puts 和 return 的输出? - 2

    我想知道Ruby用来在命令行打印这些东西的输出流:irb(main):001:0>a="test"=>"test"irb(main):002:0>putsatest=>nilirb(main):003:0>a=>"test"$stdout是否用于irb(main):002:0>和irb(main):003:0>?而且,在这两次调用之间,$stdout的值是否有任何变化?另外,有人能告诉我打印/写入这些内容的Ruby源代码吗? 最佳答案 是的。而且很容易向自己测试/证明。在命令行试试这个:ruby-e'puts"foo"'>test.

  7. Ruby 在 n *milli* 秒后超时一段代码 - 2

    在Ruby中,我需要在n毫秒秒后暂停一段代码的执行。我知道RubyTimeout库支持秒的超时:http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/index.html这可能吗? 最佳答案 只需为超时使用十进制值。n毫秒的示例:Timeout::timeout(n/1000.0){sleep(100)} 关于Ruby在n*milli*秒后超时一段代码,我们在StackOverflow上找到一个类似的问题: https:

  8. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  9. Ruby:写入 stdin 并从 stdout 读取? - 2

    我正在编写一个ruby​​程序,它应该执行另一个程序,通过stdin向它传递值,从它的stdout读取响应,然后打印响应。这是我目前所拥有的。#!/usr/bin/envrubyrequire'open3'stdin,stdout,stderr=Open3.popen3('./MyProgram')stdin.puts"helloworld!"output=stdout.readerrors=stderr.readstdin.closestdout.closestderr.closeputs"Output:"puts"-------"putsoutputputs"\nErrors:"p

  10. Ruby -> 写入二维数组 - 2

    我正在处理http://prepwork.appacademy.io/mini-curriculum/array/中概述的数组问题我正在尝试创建函数my_transpose,它接受一个矩阵并返回其转置。我对写入二维数组感到很困惑!这是一个代码片段,突出了我的困惑。rows=[[0,1,2],[3,4,5],[6,7,8]]columns=Array.new(3,Array.new(3))putscolumns.to_s#Outputisa3x3arrayfilledwithnilcolumns[0][0]=0putscolumns.to_s#Outputis[[0,nil,nil],[

随机推荐