草庐IT

phoenix-channels

全部标签

go - 从 channel 读取后主要不退出

我正在学习Go,但很难理解为什么我的应用程序无法正常退出。通过下面的代码片段,我得到了正确的结果,但main在读取完最后一个文件后永远不会退出。据我所知,这是因为它在某处是一个开放channel,但我不明白为什么以及如何做到这一点。这个应用程序的要点是获取一组PDF文件并读出其中的特定字符串。packagemainimport("fmt""os")typePDFstruct{filenamestringcodestringerrorerror}func(p*PDF)GetCode()string{returnp.code}funcmain(){jobs:=make(chanPDF)re

go - 如何返回 channel

我正在创建一个工作程序来使用来自RabitMQ队列的消息。为此,我创建了以下名为queue.go的文件packageExternalServicesimport("../domain""encoding/json""github.com/streadway/amqp""os")const(catalogQueue="catalog-queue")funcEnqueueMessageCatalog(catalog*domain.Catalog)error{marshal,err:=json.Marshal(*catalog)iferr!=nil{returnerr}jsonVal:=st

go - 如何在 Elixir Phoenix 应用程序中包含和执行 Go

我想在ElixirPhoenix应用程序中执行一些性能繁重的任务。我不想将数据发送到其他地方(外部服务)、处理它并将其返回给Phoenix应用程序,而是希望就地处理它。Go有很多数据科学包,所以我想在Phoenix应用程序中使用它们。我该怎么做?我研究并发现了使用NIF的RuSTLer(Rust)。我找不到Go变体或类似的变体。 最佳答案 使用System.cmd/3生成外部Go进程。坦率地说,我怀疑是否有可用的Go原生绑定(bind)。 关于go-如何在ElixirPhoenix应用程

go - 缓冲 channel worker panic

我使用缓冲channel编写了一个小工作队列。我希望能够“重启”这个worker。但是当我这样做时,我会感到panic,说“panic:关闭已关闭的channel”。其实我不明白为什么它是一个关闭的channel,因为它不应该在make之后再关闭。这是示例代码(http://play.golang.org/p/nLvNiMaOoA):packagemainimport("fmt""time")typeTstruct{chchanint}func(sT)reset(){close(s.ch)s.ch=make(chanint,2)}func(sT)wrk(){fori:=ranges.c

go - 我如何在 Go 中以相同的方式对来自多个 channel 的输入使用react?

我有一些并发代码有两种不同的超时间隔,一种是静态的,一种是动态的。我想对他们两个做出同样的react。这是它的要点:select{case有什么方法可以只写一次doSomething()吗?奇怪的是,select在这方面不如switch灵活。 最佳答案 在您的特定情况下,您可以使用类似的东西timeout:=min(staticTimeoutInterval,dynamicTimeoutInterval)select{case关于switch和select看似不一致的处理-虽然这些语句具有相似的语法,但switch的目的是分支执行,

go - 如何在 go 中使用 channel 填充数组

我正在尝试构建一个带有gochannel的数组。我不关心广告订单,但我只收到来自channel的最后一项。packagemainimport("fmt")funcAddToMap(thingstring,valstring,cchanmap[string]string){mappy:=make(map[string]string)mappy[thing]=valc我的输出是:[map[barf:five]] 最佳答案 当数据被写入其中时,您需要从channel中连续读取。当你完成将数据泵入channel后,关闭它。这是它的工作原理。

go - 我在 golang 中错误地使用了 channel 吗?

我来自Node.js背景,在那里做一些异步工作非常容易,然后在完成长时间运行的任务后做更多的工作,我确信它在Go中是一样的,但我只是没有'我还没有完全了解channel的运作方式。我正在为我玩的一个老游戏构建一个解析器,它分析拍卖数据日志中的行并解析它们以通过套接字io流式传输到网站上的实时提要。一个文件一次可以发送100行,我的解析器必须一次分析每一行并从每一行中提取元信息(例如商品、商品价格等)每一行都有这个for循环针对它运行(这假设项目列表的部分是从正则表达式派生的):itemChannel:=make(chanItem)for_,itemName:=rangeitemList

go - Go 中的 len(channel) 是线程安全的吗?

一个channel可能被多个Go例程使用。通过使用一些Go例程线程安全的len(channel)获取channel的长度? 最佳答案 这在某种程度上取决于您的用例调用确实是安全的,但是当其他goroutines从该channel发送/获取时,结果不可信 关于go-Go中的len(channel)是线程安全的吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/42321309/

去旅游#10 : What is the use of that done channel in the crawler solution

在thissolution到tenthslide并发Go之旅我有一个关于以下部分的问题:done:=make(chanbool)fori,u:=rangeurls{fmt.Printf("->Crawlingchild%v/%vof%v:%v.\n",i,len(urls),url,u)gofunc(urlstring){Crawl(url,depth-1,fetcher)done在channeldone中添加和删除true并运行两个单独的for循环有什么目的?是否只是阻塞直到go例程完成?我知道这是一个示例练习,但这样一开始不会破坏创建新线程的意义吗?为什么你不能只调用goCrawl

go - 带 channel 的 WaitGroup goroutines

我正在从博客中学习WaitGrouphttps://nathanleclaire.com/blog/2014/02/15/how-to-wait-for-all-goroutines-to-finish-executing-before-continuing/代码:packagemainimport("fmt""sync""time")funcmain(){messages:=make(chanint)varwgsync.WaitGroup//youcanalsoaddtheseoneat//atimeifyouneedtowg.Add(3)gofunc(){deferwg.Done(