草庐IT

handle_asynchronously

全部标签

go - 分段文件上传 : How to Handle FileHeaders

我需要读取一个多部分表单文件。我将自定义reqobj传递给处理程序函数而不是http.request对象,我使用的是GorillaMux。处理程序签名是这样的:funchandlerFunc(whttp.ResponseWriter,cR*custReqObj)我是这样访问它的:fileHeaders:=cR.MultipartForm.File["file"]fileHeader:=fileHeaders[0]fileName:=fileHeader.Filenamefile,err:=fileHeader.Open()因为我没有请求对象,所以我不能这样做:request.FormF

asynchronous - Go队列处理失败重试

我们有一堆文件要在处理后上传到远程blob存储。目前,前端(PHP)创建此类文件的redis列表,并为其分配一个唯一ID,称为JobID。然后它将唯一ID传递给beanstalk管,由Go进程接收。它使用一个名为Go的库workers以net/http所做的方式处理每个作业ID。它接收作业ID,检索Redis列表并开始处理文件。但是,目前一次只能处理一个文件。由于这里的操作是I/O绑定(bind),而不是CPU绑定(bind),直觉表明每个文件使用一个goroutine是有益的。但是,我们希望在失败时重试上传,并跟踪每个作业处理的项目数。我们不能启动无限数量的goroutines,因为

asynchronous - Golang 持久 channel 接受来自多个函数调用的输入

我有一个函数a:funca(input*some_type){//dosth.b(input)}此函数被多次调用。我希望函数b无限期地等待来自函数a的输入,并在它收集到n个输入后执行操作。funcb(input*some_type){//waituntilreceivedninputsthendosth.withallinputs}我该怎么做呢?我的第一个想法是在a和b之间使用sync.WaitGroup。 最佳答案 这是一个常见的生产者-消费者问题。使用channel等待来自另一个例程的输入。这样的事情有帮助吗?在这个特定的例子中

error-handling - Go 中如何处理异步错误?

我正在开发我的第一个真正的Go项目,一个消息传递API。我使用channel在使用线程不安全、基于事件的C协议(protocol)库的用户goroutine和库goroutine之间传递消息和其他数据。详情https://github.com/apache/qpid-proton/blob/master/proton-c/bindings/go/README.md我的问题分为两个相关部分:1。跨channelhandler错误的常用习惯用法有哪些?一端的goroutine爆炸了,我如何确保另一端解除阻塞,得到一个error值并且以后不会再次被阻塞?致读者:我可以关闭channel,但没

asynchronous - NATS async reply to request 不是异步的

我正在尝试使用GO语言在gnatsd中实现请求/响应功能,我意识到gnatsd不会以异步方式回复请求。我开始使用NATSgithub示例进行调查https://github.com/nats-io/go-nats/tree/master/examples-例子nats-req.go和nats-rply.go。这些示例运行良好。然后我简单地修改了它们以测试gnatsd上的并行请求,并提供一些调试信息,其中处理异步回复的goroutineID。有修改示例源码。nats-rply.go已被修改为仅返回传入请求的文本以及有关当前goroutineID的信息。我还在异步处理函数中添加了1秒休眠来

error-handling - Go 中如何指定和处理特定的错误?

我编写了这个通过RedditJSON的非常基本的解析器,我很好奇我如何专门管理Go中的错误。例如,我有一个链接的“获取”方法:funcGet(redditstring)([]Item,error){url:=fmt.Sprintf("http://reddit.com/r/%s.json",reddit)resp,err:=http.Get(url)iferr!=nil{returnnil,err}deferresp.Body.Close()ifresp.StatusCode!=http.StatusOK{returnnil,err}/**Othercodehere*/}我如何处理来自

asynchronous - 戈朗 ZeroMQ : REQ/REP senseless non-blocking

在Python上,ZeroMQ.recv()/.send()操作是阻塞的,这对于REQ/REP.在Golang中,我必须将zmq.DONTWAIT传递给.recv()并且.send()操作以使其工作。但问题是,流程需要锁步,所以:server.recv()client.send()client.recv()server.send()在3到4之间,奇怪的事情开始了,因为它们是异步的。当客户端发送了一条消息,而服务器还没有收到消息,但客户端试图接收响应时,锁步就不再是锁步了。是否有某种zmq.DOBLOCK与zmq.DONTWAIT不同?还是我弄错了什么?编辑:我在C中为zeromq使用这

error-handling - 返回结构时的错误处理

据我所知(来自here和阅读standerd库),在返回数据和错误的库中处理错误的惯用方式。问题是,当我确实运行时必须返回一个错误,我应该返回什么作为我的数据?空结构?0?举个例子//LoadtheconfigfuncLoadConfig(locationstring)(Config,error){//ReadthefileconfigFile,err:=ioutil.ReadFile(location)iferr!=nil{returnConfig{},err}//ConvertittoConfigstructvarconfigConfigjson.Unmarshal(configF

戈朗 : how to handle blocking tasks optimally?

众所周知,goroutine是同步但非阻塞的处理单元。golang调度程序处理非阻塞任务,例如来自字符设备的套接字、定时器、信号或其他事件非常好。但是block设备io或CPU敏感任务怎么样?它们在完成之前不能被打断,也不能被多路复用。运行goroutine的OS线程将卡住,直到goroutine返回或让步。在这种情况下,调度粒度会变差。当然,您可以在代码中将任务拆分为更小的子任务,例如,不要一次复制1GB的文件,而是先复制10MB,让出,再复制另外10MB等,这样同一操作系统线程中的其他goroutines有机会运行。CPU密集型任务的另一个示例:逐个压缩文件并最终合并它们。但这破坏

http - 服务器启动后如何更改 http.Handle() 中的处理程序?

我在Go中使用socketio"github.com/googollee/go-socket.io"。出于某种原因,我必须制作一个新的*socketio.server并将其注册到"/static/",它已经在旧的*socketio.server上注册了。这意味着我必须在服务器启动后替换http.Handle("/socket.io/",ioserver)中的处理程序ioserver。下面是我的部分代码,当有事情发生时,我会创建一个新的ioserver。我希望新的ioserver成为http.Handle("/socket.io/",ioserver)中的处理程序ioserver,_=s