草庐IT

database-concurrency

全部标签

concurrency - 在 golang 中创建同步列表

首先,如果这是一个愚蠢的问题,请原谅我。我想创建一个通用的同步列表(就像在Java中一样)以便在我的Go项目中重用。我找到了Go的源码linkedlist我想知道是否只需将互斥锁添加到列表操作函数中就足够了吗? 最佳答案 如果您要创建并发安全的容器,则需要保护所有对数据的访问,而不仅仅是写入。在不同步读取的情况下检查元素,甚至调用Len()都可能返回无效或损坏的数据。用互斥锁保护整个数据结构可能比实现自己的并发链表更容易。 关于concurrency-在golang中创建同步列表,我们在

戈朗 : limit concurrency levels of a blocking operation

我有以下场景:我在channel上收到一条消息,告诉我上传文件。上传是由阻塞函数uploadToServer完成的。zipGenchannel每秒可能会收到几条消息,我想同时上传最多5个文件(不多,但可能更少-取决于在zipGen上发送了多少消息由超出此问题范围的第三名worker提供)。listenToZips函数在go例程中运行(golistenToZips()在文件的init函数中):funclistenToZips(){for{select{casezip:=如果我启动gouploadToServer(zip)而不是仅仅uploadToServer(zip)-我会得到太多的并发

戈朗 : Processing 5 huge files concurrently

我目前在Perl中处理了5个巨大的(每个400万行)日志文件,我想我可以尝试在Go中实现相同的功能及其并发功能。因此,由于对Go缺乏经验,我正在考虑按以下方式进行操作。对该方法的任何评论将不胜感激。一些粗略的伪代码:varwg1sync.WaitGroupvarwg2sync.WaitGroupfuncprocessRow(rRow){wg2.Add(1)deferwg2.Done()res=returnres}funcprocessFile(fFile){wg1.Add(1)open(newfileFile)deferwg1.Done()line=result=goprocessRo

mysql - 在读取 sql.Rows.Next() 执行另一个查询时返回错误 : 1046 no database selected

(错误检查和一些细节省略)设置我是这样打开数据库的:d,err=sql.Open("mysql","user:passwd@tcp(127.0.0.1:3306)/")_,err=d.Exec("CREATEDATABASEIFNOTEXISTSmyblog")_,err=d.Exec("USEmyblog")但是如果我把它改成这样,一切都很好:d,err=sql.Open("mysql","user:passwd@tcp(127.0.0.1:3306)/myblog")执行我有两个表:articlesID,ArticleID,Title,CreateDate,PreviewConte

concurrency - 为什么这段 Go 代码会死锁?

packagemainimport"fmt"import"runtime"import"time"funccheck(idint){fmt.Println("Checked",id)我是Go的新手,所以任何指示都会很棒。我将如何调试这样的东西?您可以运行代码片段http://play.golang.org/p/SCr8TZXQUE更新:没有这行也能工作在Playground上,我想知道为什么?(正如@dystroy所提到的,这可能是因为Playground处理时间的方式)当我在本地尝试时,这是输出:Calledwith0Calledwith1Checked0Calledwith2Che

concurrency - Golang 上传整个目录并发返回到许多打开的文件

我正在尝试将整个目录上传到服务器。它适用于小目录,但如果有100多张图片,它会返回“对许多打开的文件”的错误。我在读取文件后立即关闭文件。知道如何解决这个问题吗?这是我的代码funcuploadDir(pathstring)error{dir,err:=os.Open(path)iferr!=nil{returnerr}files,err:=dir.Readdirnames(-1)iferr!=nil{returnerr}dir.Close()errChan:=make(chanerror)resChan:=make(chan*client.PutResult)remaining:=l

concurrency - Golang 使用 goroutines 并行下载多个文件

是否可以使用goroutines并行下载和保存文件?下面是我从保管箱下载文件的代码:packagemainimport("encoding/json""fmt""io""io/ioutil""net/http""net/url""os""path/filepath")constapp_keystring=""constapp_secretstring=""varcodestringtypeTokenResponsestruct{AccessTokenstring`json:"access_token"`}typeFilestruct{Pathstring}typeFileListRes

concurrency - 在达到超时之前如何读取 UDP 连接?

我需要读取UDP流量直到达到超时。我可以通过在UDPConn上调用SetDeadline并循环直到我收到I/O超时错误来执行此操作,但这似乎有点hack-ish(基于错误条件的流量控制)。下面的代码片段似乎更正确,但并没有终止。在生产中,这显然会在goroutine中执行;为了简单起见,它被写成一个主要功能。packagemainimport("fmt""time")funcmain(){for{select{case为什么给定的程序没有终止?基于https://gobyexample.com/select,https://gobyexample.com/timeouts,和https

concurrency - 并发客户端的 Goroutines 或锁

通常在使用多个goroutines编写并发程序时,这些goroutines需要访问客户端,例如编写RESTAPI,其中每个HTTP处理程序需要使用单个初始化的Redis客户端来读取和写入Redis实例。我要么有一个带有互斥锁的客户端实例,因此在任何时候只有一个goroutine可以使用它,要么有一个客户端goroutine,其他goroutine可以通过channel请求读取。两种方式都有效,但我想知道哪种方式更惯用?感谢您的帮助 最佳答案 如果您只有一个客户端,并且只能在其上执行简单的操作,请使用互斥体。它通常简单易懂,不像gor

database - Golang gorm mock

我正在使用gorm在我的项目中。我可以在没有数据库连接的情况下模拟这个数据库orm进行测试吗?问题是我们有CI工具,但我没有数据库或没有足够数据进行测试的数据库。换句话说,我不想在每次测试时都设置一个数据库,因为在这些情况下,CI工具每次都会创建一个容器来运行测试。测试数据库相关方法的最佳方法是什么?我在我的解决方案中使用依赖注入(inject),因此很容易用模拟数据库替换数据库。但是gorm有很多orm相关的功能。这是一个处理程序,例如:functokenIntrospectionHandler(db*gorm.DB)http.HandlerFunc{returnhttp.Handl