jjzjj

multithread

全部标签

multithreading - Golang 线程池调度程序的目的和顺序

我刚刚用go写完了一个简单的代理应用程序:代码从一个接口(interface)获取UDP数据包,加密数据,然后使用TCP将其发送到另一个接口(interface)。目前,我正在使用三个goroutines:一个用于接收数据,一个用于加密,一个用于发送数据。我刚刚开始尝试寻找提高代码效率和速度的方法。首先,我想为每个需要加密的数据包创建一个新的goroutine,但在阅读了以下两篇博文后,我明白这不是正确的做法:http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/http://nesv.g

multithreading - 使用 golang sync.WaitGroup 的正确方法是什么

如golangdoc中所述,sync用于低级库例程。OtherthantheOnceandWaitGrouptypes,mostareintendedforusebylow-levellibraryroutines.Higher-levelsynchronizationisbetterdoneviachannelsandcommunication.我不太理解这个语句,我像下面的例子一样使用同步。我的目的只是让主线程等待所有其他线程完成,类似于c++线程库中的.join()。问题:1:这样使用sync合适吗?或者我应该使用channel而不是同步?2:channel和sync有什么区别?

multithreading - 半异步代码逻辑

我正在努力找出一种可行的设计,将同步流与异步行为混合在一起。我有4个组件:播种者worker出版商更新者我唯一的限制是,一旦Seeder播种数据,它必须被阻止,直到Updater没有完全完成所有任务的处理。前3个组件可以很容易地同步,但更新程序必须并行工作,否则将永远无法完成任务。所以流程是:播种机->worker->发布者->更新者-->播种者->worker->发布者->更新者...并且这个流必须永远旋转。播种和更新是针对数据库的。不幸的是,这个特定的数据库不允许不同的设计。我最好的办法是使用sync.WaitGroup来同步Updatergoroutines并将其他所有内容保持在

multithreading - 如何测试在 goroutine 中监视文件的函数

我有一个函数可以通过fsnotify监视certian文件并在文件更改时调用回调。如果回调返回false,则观看结束:import("github.com/golang/glog""github.com/fsnotify/fsnotify")typeWatcherFuncfunc(errerror)boolfuncWatchFileChanges(filenamestring,watcherFuncWatcherFunc){watcher,err:=fsnotify.NewWatcher()iferr!=nil{glog.Errorf("Goterrorcreatingwatcher%

multithreading - Goroutines, channels select 语句

我在构建我的goroutines和channel时遇到问题。我的select语句在所有goroutine完成之前一直退出,我知道问题出在我发送完成信号的地方。我应该在哪里发送完成信号。funcstartWorker(okchanLeadRes,errchanLeadResErr,quitchanint,verbosebool,wg*sync.WaitGroup){varresultsProcessResultsdeferwg.Done()log.Info("Starting...")start:=time.Now()for{select{caselead:=

multithreading - goroutine 多次使用同一行

目前我有一个场景,我有一个巨大的文件(例如我要说500k行的文本),我的想法是使用worker(线程)来处理它们,每个线程100个。运行我的代码后,我仍然想知道为什么goroutines不止一次地使用同一行?我猜它正在努力完成工作。这是我的代码packagemainimport("log""bufio""fmt""encoding/csv""encoding/json""io""os""sync")typeIMDBDataModelstruct{Colorstring`json:"color"`DirectorNamestring`json:"director_name"`NumCri

multithreading - 具有分层输出的堆栈跟踪

我正在调试一个包含很多似乎死锁的goroutines的go程序。我想在它卡住时有一个堆栈跟踪。但是输出很长,不适合我的终端缓冲区。所以我想把它输出到一个文件中。但是,如果我将stderr输出到文件,我无法(轻松地)检测到它何时卡住。我希望tee适合这个:去测试./foo-v|&teelog.txt但是,当我按下Ctrl+Alt+\时,终端或文件中均未显示任何堆栈跟踪输出。不知何故,它似​​乎无法通过tee的旅程。有更好的方法吗? 最佳答案 根据MarkPlotnick的评论,在tee工作之前捕获SIGQUIT信号(至少对我而言):去

multithreading - 在 Go 中关闭自馈 channel

我正在尝试使用Go中的并发和channel。我面临的问题主要是并发的想法,所以我不认为以下逻辑是错误的或者应该改变。我有一个缓冲区大小为“N”的缓冲channel,它还代表将要创建的goroutine的数量。所有例程都从一个channel读取并写入另一个channel,主goroutine将打印来自最终channel的值。1个输入channel---N个goroutines查找并添加到输入和输出---1个输出channel问题是我总是遇到死锁,因为我不知道如何关闭一个正在self馈送的channel,也不知道它什么时候会停止,所以我也无法关闭输出channel。代码如下:package

multithreading - 多人围棋程序

我有一个简单的程序,可以生成随机字符串和数字并将其放入特定格式:输出:A=SKEK673KJKB=67235C=PDCNE39JSWL我有4个函数,包括main:funcgenRandInt()string{//returnstring(randInt)}funcgenRandStr()string{//return(randStr)}funcgenFakeData()string{fmt.Println("A="+genRanStr()+genRandInt().....etc)}funcmain(){genFackeData()}到目前为止程序运行良好,我通过bash循环执行它以便

multithreading - 阅读缓存DIY书时的一个Go map线程安全问题

我正在读一本书,它教我如何编写像Redis这样的简单缓存。以实现分布式哈希为目标,项目必须有key迁移,这需要一个迭代器。而且我认为可能存在一些问题。他的书是关于迭代map的,但是在迭代的同时,读取锁的保持不是连续的。原因是尽量不影响主缓存进程。我相信一定存在线程安全问题,因为主缓存线程仍在写入映射。我写了一个演示,但不确定。//bookcodetypeinMemoryScannerstruct{pairpairChan*paircloseChchanstruct{}}func(c*inMemoryCache)NewScanner()Scanner{pairCh:=make(chan*