草庐IT

Goroutine-safe

全部标签

goroutine 值返回顺序

这个问题在这里已经有了答案:Golangchanneloutputorder(4个答案)关闭4年前。为什么下面的代码总是返回2,1,而不是1,2。functest(xint,cchanint){c

concurrency - 如何关闭等待 I/O 的 goroutine

我创建了两个go例程sender和receiver,sender会不断从用户(键盘)获取数据并写入stream,receiver会独立获取值从流中将其打印到屏幕上。两者都是并发使用goroutine在某个时间点接收方失败并关闭连接并退出接收方goroutine,但是等待用户输入(i/o操作)的sendergoroutine不会被关闭。这种场景下如何退出所有goroutines?下面是这个场景的一段示例代码。packagemainimport("fmt""time")varstopbool=falsefuncsender(){str:=""for!stop{fmt.Scanf("%s",

multithreading - goroutine 或多线程在 golang 中不起作用

我试图在golang中实现多线程。我能够实现goroutines,但它没有按预期工作。下面是我准备的示例程序,functest(sstring,fo*os.File){vars1[105]intcount:=0forx:=1000;x输出-good0bye0bye0bye0bye0good1bye1bye1bye1bye1good2bye2bye2bye2bye2....等等。上面的程序会创建一个文件,并在文件中写入“Hello”和“bye”。我的问题是我正在尝试创建5个线程并希望使用不同的线程处理不同的值。如果你会看到上面的例子,它打印了4次“bye”。我希望使用5个线程输出如下所示

go - 从接收端关闭 channel : deadlock when accessing sync. 来自多个 goroutine 的互斥量

我正在尝试从接收端实现优雅的channel关闭。是的,我知道这违反了channel关闭规则:...don'tcloseachannelfromthereceiversideanddon'tcloseachannelifthechannelhasmultipleconcurrentsenders.但是我想实现这样的逻辑。不幸的是,我在很多情况下都没有陷入死锁问题:应用程序只是无限期地挂起,试图再次锁定相同的锁定Mutex。所以,我有2个协程:将写入channel的一个另一个将接收数据+将从接收端关闭channel。我的channel用sync.Mutex和closedbool标志包裹在结

mongodb - 如何确保 goroutine 在退出前完全运行

我有一个调用go例程的函数,该例程调用其中的其他函数。然而,那些go例程在完全完成之前就已经退出了。我如何确保函数(migrateUserHelper)中的所有底层代码在退出之前运行。下面是我的代码:funcMigrateUsers(){varwgsync.WaitGroupuserCount:=10//userDAO.GetUserCount()limitSize:=2count:=0divisor=userCount/limitSizefordivisor>0{wg.Add(1)gomigrateUserHelper(limitSize,&wg,count)divisor=divi

go - 在 goroutine 中等待主线程 sleep

编写这段非常基本的代码来理解channel。如果协程中有等待,为什么主协程在等待它?我读到主goroutine需要等待时间,因为在调用goroutine后控制权会立即传回给它。为什么goroutine不像java中的主线程和子线程那样可以并行运行?funcmain(){channel:=make(chanint)gofunc(){time.Sleep(3*time.Second)}()for{fmt.Println("../"); 最佳答案 我认为你的主线程正在等待来自channel的东西funcmain(){channel:=ma

goroutine race condition 解决方案

我正在尝试了解如何为以下代码修复此竞争条件。sayHello:=func(){fmt.Println("Hellofromgoroutine")}gosayHello()time.Sleep(1)fmt.Println("Hello,playground")期望:我只想知道最好的解决方案是什么,我应该使用WaitGroup还是有更好的解决方案?所以我想出了以下解决方案:varwgsync.WaitGroup//deferwg.Wait()sayHello:=func(){deferwg.Done()fmt.Println("Hellofromgoroutine")}wg.Add(1)g

go - 在 goroutine 中更新全局变量的不同行为

我有一个go程序如下。它启动NumberOfCPUs-1goroutines并且在每个goroutine内部只更新全局变量x。输出为x=0。funcmain(){varxintthreads:=runtime.GOMAXPROCS(0)-1fori:=0;i如果我稍微改变一下程序,像这样:funcmain(){varxintthreads:=runtime.GOMAXPROCS(0)fori:=0;ix将是一些随机的大值。我认为这可能与goroutine调度器有关。在第一种情况下,goroutines的数量小于cpucores的数量,因此mainfunc可以与所有现有的goroutin

go - 使用 goroutine 的多线程

我正在尝试使用Go来自动化我的侦察工具。到目前为止,我可以在kali(Nikto/whois)中运行两个基本工具。现在我希望它们并行执行,而不是等待一个函数完成。阅读了一下之后,我开始知道这可以通过使用goroutines来实现。但我的代码似乎不起作用:packagemainimport("log""os/exec""os""fmt")varurlstringfuncnikto(){cmd:=exec.Command("nikto","-h",url)cmd.Stdout=os.Stdouterr:=cmd.Run()iferr!=nil{log.Fatal(err)}}funcwho

go - channel 什么时候阻塞 goroutine

如果我定义一个没有缓冲区的channel并向其中写入一个数据,它会立即阻塞(以便内核将寻找另一个未阻塞的goroutine从该channel读取),还是继续执行并在下一次时阻塞某些代码在尚未读取时尝试再次写入channel?下面是我为了研究这个问题写的两段代码。代码1:packagemainimport"fmt"funcmain(){c:=make(chanint)gofunc(){fori:=0;i输出是这样的:number0insertedintochannelnumberpopedfromchannel0numberpopedfromchannel1number1inserted