取消用户特定的goroutines
我有一个应用程序(Web应用程序),可以让用户使用Twitter OAuth登录并提供自动推文删除功能.用户登录到Web应用程序后,我将为每个用户旋转一个goroutines(通过REST API),该用户将删除用户列表. 说,每个用户的用户将有100个用户: 在删除过程的中间,如何停止删除GO例程. eg:用户30要求在启动2分钟的删除过程后停止删除推文(这应通过对我的应用程序的API调用来完成). 创建GO例程的最佳实践是什么,以最大程度地考虑HTTP请求和Twitter API限制的应用程序的性能.我应该每个用户创建GO例程还是实现工作池? 信息:我正在使用 编辑: 我找到了一种使用与上下文的地图实现此功能的方法.这是参考的代码.学分致package main import ( "context" "fmt" "log" "net/http" "sync" "time" ) // a concurrent safe map type by em
4 2023-10-28
编程技术问答社区
在Go中取消一个阻塞性操作
我在我不控制的第三方库中有一个阻止操作.它可能永远存在.因此,我想设置一个超时.明显的方法是用通道和goroutine包裹它,然后使用time.After选择结果.但是,问题是运行阻止操作的goroutine可能会永远发生. 这是一个示例,可以说明此 http://repl.it/90o 有没有办法取消goroutine或收集了垃圾? 解决方案 您不能从"外部"中停止goroutine. Goroutine必须支持某种终止信号(通常是通道).但是,如果没有,您将无法强迫或杀死它. 如果您对正在使用的第三方lib无法做任何事情,那么您可以做的最多是在其他过程中运行它(在您的GO应用程序启动的其他应用程序中),您可以杀死,但是那简直太丑陋了. 其他解决方案 我认为您无能为力.在旅途中,您不能从外面停止goroutine.如果您无法修复此库,并且认为它可以永远封锁,那么请编写您可以控制的新图书馆.
8 2023-10-21
编程技术问答社区
在 CPU 密集型工作中,Go'调度程序会将控制权从一个 goroutine 移交给另一个 goroutine 吗?
golang方法会产生Goroutines 当遇到Syscall时,调度程序将从一个Goroutine到另一个Goroutine.我知道这意味着,如果您运行了多个goroutines,并且一个人开始等待诸如HTTP响应之类的东西,则调度程序可以将其用作提示,以从该goroutine到另一个. . 但是,没有涉及Syscall的情况呢?例如,如果您拥有与可用的逻辑CPU核心/线程一样多的goroutines,并且每个goroutines都在CPU密集型计算中中间,则无涉及Syscalls.从理论上讲,这将使CPU的工作能力饱和. GO Scheduler是否仍然能够发现机会从其中一个goroutines到另一个goroutines的控制权,这也许不需要那么长的时间才能运行,然后返回控制返回到其中一个goroutines,执行了长长的CPU密集型计算? 解决方案 这里几乎没有任何承诺. goroutines现在是异步的抢占.结果,没有功能调用的循环不再潜在地僵持调度程序
20 2023-10-20
编程技术问答社区
从不同的线程读取数值
我正在编写GO中的软件,该软件可以进行很多并行计算.我想从工作人员线程收集数据,但我不确定如何以安全的方式进行数据.我知道我可以使用频道,但是在我的情况下,它们使它变得更加复杂,因为我必须以某种方式同步消息(等到主线程中的每个线程发送某些内容). 方案 主线程创建 n Worker实例并在goroutine中启动其work()方法,以便每个工人在自己的线程中运行.每10秒钟,主线程应从工人那里收集一些简单的值(例如迭代计数)并打印一个合并的统计量. 问题 阅读工人的价值观安全吗?主线程只会读取值,每个线程将编写其自己的值.如果值在阅读时,值是几纳秒. 是可以的. 关于如何以一种简单的方式实施它的其他想法? 解决方案 在GO中,如果至少一个访问是写入,则无需同步即可从多个goroutines并发访问.您的案例符合列出的条件,因此您必须使用某种同步,否则该行为将不确定. 如果Goroutine(S)想将值发送到另一个,则使用 通​​道.您的情况并非
10 2023-10-20
编程技术问答社区
在GOLANG中尽可能快地以递归方式循环浏览所有文件夹中的所有文件
我正在面临一个问题,即使在论坛上度过了一天之后,我仍然无法完全理解和解决. 因此,在这里,我做出了一个函数,可以在所有文件夹以及其子文件夹上循环,并且具有2个子功能: - 对于找到的每个文件,列出文件的名称. - 对于找到的每个文件夹,重新启动同一父函数以再次找到子文件和文件夹. 为了使其更简单,宏列出了带有递归的树中的所有文件.但是我的目标是尽可能快地这样做,因此每次遇到一个新文件夹时我都会运行一个新的Goroutine. 问题: 我的问题是,当树结构太大时(文件夹和子文件夹中的文件夹太多...)脚本会生成太多线程,因此给了我一个错误.所以我增加了这个限制,但突然间,PC不再想要:/ 所以我的问题是,如何制作适合我代码的工人系统(使用池化)? 不管我看多少,我都看不到如何说,例如,将新的goroutines生成一定限制,是清空缓冲区的时间. 源代码: https://github.com/lamlam com./lamlam lamlam lame l
4 2023-10-20
编程技术问答社区
如何使用一个goroutine池
我想从Yahoo Finance下载股票价格电子表格.我将为自己的goroutine中的每个股票提出HTTP请求.我有大约2500个符号的列表,但是我不希望一次提出250个请求.在Java中,我会创建一个线程池并在免费时重复使用线程.如果您愿意的话,我试图找到类似的东西,goroutine池,但找不到任何资源.如果有人能告诉我如何完成手头的任务或将我指向我的资源,我将不胜感激.谢谢! 解决方案 我想最简单的方法是创建250个goroutines并传递一个频道,您可以使用该频道将链接从主要的goroutine传递到子女,聆听该频道. 当所有链接都传递给Goroutines时,您关闭了一个频道,所有goroutines都完成了他们的工作. 要使自己免于主要goroutine在儿童处理数据之前完成完成,您可以使用sync.WaitGroup. 这是我上面告诉的一些代码要说明(不是最终的工作版本,但显示了要点): func worker(linkChan chan
4 2023-10-20
编程技术问答社区
8kb的Goroutines和1mb的Windows操作系统线程
作为Windows用户,我知道OS线程由于golang golang如何使用〜8kb的内存,如果OS线程更加glutton,则消耗〜1 mb的内存. goroutine有点虚拟线程吗? 解决方案 goroutines不是线程,它们是(源自 spec ): ...在同一地址空间内的独立并发控制线或 goroutine . 有效go 将它们定义为: 它们称为 goroutines ,因为现有的术语 - 线程,coroutines,Process等等 - convey不准确的内涵. Goroutine具有一个简单的模型:它是与同一地址空间中其他goroutines同时执行的函数.它是轻巧的,几乎不超过堆栈空间的分配.堆栈开始很小,因此它们很便宜,并根据需要分配(和释放)堆存储. Goroutines没有自己的线程.相反,多个goroutines已(可能是)多路复用到同一OS线程,因此,如果应该阻止一个(例如,等待I/O或阻止通道操作),其他人则继续运行.
4 2023-10-20
编程技术问答社区
Go, tcp 太多打开的文件调试
这是一个直接的GO HTTP(TCP)连接测试脚本 func main() { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, client") })) defer ts.Close() var wg sync.WaitGroup for i := 0; i
8 2023-10-14
编程技术问答社区
一个以上的goroutine打印到stdout是否安全?
我的程序中有多个goroutines,每个程序都在没有任何明确同步的情况下呼叫fmt.Println.这是安全的(即,每行是否在没有数据损坏的情况下单独出现),或者我需要专门创建另一个具有同步的goroutine来处理打印? 解决方案 不,即使您有时不会发现任何麻烦,也不安全. IIRC,FMT软件包试图在安全的一边,因此可能会发生某种混合,但没有过程崩溃,希望 . 这是一个更通用的GO文档规则的实例:除非另有说明或从上下文明显地指定,否则事物不安全. . 一个人可以使用带有一些小初始设置的日志软件包的fmt.print*功能的一个安全版本. 其他解决方案 一切fmt确实可以看到w.Write() 我建议使用全局日志程序. 此外,如果您只想记录数据,请使用log软件包,该软件包锁定了正确访问输出的访问. 请参阅实施 其他解决方案 常见方法(FMT.Printline)不安全.但是,有一些方法. log.logger是" goroutine
4 2023-10-13
编程技术问答社区
如何在不使用time.Sleep的情况下等待所有的goroutine完成?
此代码选择同一文件夹中的所有XML文件,因为被调用的可执行文件和异步将处理应用于回调方法中的每个结果(在下面的示例中,只有文件的名称已打印出来). ). ) 如何避免使用睡眠方法来防止主要方法退出?我在频道周围缠绕着头时(我认为这是要同步结果所需的),因此对任何帮助表示赞赏! package main import ( "fmt" "io/ioutil" "path" "path/filepath" "os" "runtime" "time" ) func eachFile(extension string, callback func(file string)) { exeDir := filepath.Dir(os.Args[0]) files, _ := ioutil.ReadDir(exeDir) for _, f := range files { fileNa
8 2023-10-13
编程技术问答社区
Switch和Select在GO中有什么区别?
switch和select之间是否有任何区别, 除了一个人提出争论,另一个没有吗? 解决方案 a select仅与通道一起使用. 示例 a switch与混凝土类型一起使用. 示例 a select将随机选择多个有效选项,而a switch将按顺序进行(并且需要秋季以匹配多个.) 请注意,与关键字.(type) 一起使用时,开关也可以翻阅接口的类型 var a interface{} a = 5 switch a.(type) { case int: fmt.Println("an int.") case int32: fmt.Println("an int32.") } // in this case it will print "an int." 其他解决方案 开关用于基于任何类型的可变值做出决定.阅读 this 有关更多详细信息: GO的开关比C更一般.表达式不必是常数甚至整数,而是在找到匹配匹配之前对案例进行评估,如
12 2023-10-12
编程技术问答社区
在Golang中防止Ctrl+C中断exec.Command。
我注意到,即使通过signal.Notify拦截了中断呼叫,过程始于exec.Command被中断.我已经完成了以下示例以说明问题: package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") } func main() { var doneChannel = make(chan bool) go sleep() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, s
10 2023-10-04
编程技术问答社区
为什么一个不读/写其内容的结构体的方法仍然会引起竞赛情况?
来自 dave Cheney Blog ,以下代码显然会导致竞赛案例,该案例仅通过将func (RPC) version() int更改为func (*RPC) version() int来解决: package main import ( "fmt" "time" ) type RPC struct { result int done chan struct{} } func (rpc *RPC) compute() { time.Sleep(time.Second) // strenuous computation intensifies rpc.result = 42 close(rpc.done) } func (RPC) version() int { return 1 // never going to need to change
8 2023-10-03
编程技术问答社区
golang结构的无锁并发读写也可以运行吗?
concurrentMap()功能具有WARNING: DATA RACE,致命错误:concurrent map read and map write concurrentStruct()有警告:数据竞赛,但是运行确定 为什么结构可以数据竞争? package main import ( "sync" ) func main() { // concurrentMap() concurrentStruct() // concurrentStructWithMuLock() } type Metadata struct { mu sync.RWMutex // 🔐 key bool } // concurrentStruct 并发操作结构体 // concurrent read and write the struct // go run -race main.go 有 WARNING: DATA RACE
28 2023-10-03
编程技术问答社区
在不关闭连接的情况下,关闭从TCP连接中读取信息的goroutine
我喜欢Go Go在内部进行I/O多路复用的方式,并自行安排绿色线程(在此处使用绿线),从而自由地编写同步代码. 我知道当没有数据可用时,TCP插座是non-blocking> non-blocking> read.鉴于这一点,conn.Read(buffer)将检测到这一点,阻止GO例程进行连接读取,而插座缓冲区中没有可用的数据.有没有办法在不关闭基础连接的情况下停止此类程序.我正在使用一个连接池,所以关闭TCP连接对我来说是没有意义的,并希望将连接返回池中. 这是模拟这种情况的代码: func main() { conn, _ := net.Dial("tcp", "127.0.0.1:9090") // Spawning a go routine go func(conn net.Conn) { var message bytes.Buffer for { k := make([]byt
12 2023-09-06
编程技术问答社区
追加不是线程安全的?
我注意到,如果我尝试使用for循环中的goroutines尝试将其附加到切片中,则在某些情况下,我会丢失/空白数据: destSlice := make([]myClass, 0) var wg sync.WaitGroup for _, myObject := range sourceSlice { wg.Add(1) go func(closureMyObject myClass) { defer wg.Done() var tmpObj myClass tmpObj.AttributeName = closureMyObject.AttributeName destSlice = append(destSlice, tmpObj) }(myObject) } wg.Wait() 有时,当我从destSlice中打印全部AttributeName s时,某些元素是空字符串(""),而其
8 2023-09-04
编程技术问答社区