我有这个测试代码。
一段时间后,所有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/
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案: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
我正在尝试解析一个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
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我想知道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.
在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:
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
我正在编写一个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
我正在处理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],[