文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

第一个请求不在 goroutine 函数的开头发送

2024-04-04 23:35

关注

哈喽!今天心血来潮给大家带来了《第一个请求不在 goroutine 函数的开头发送》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我正在我的代码中运行 goroutine。比如说,如果我将线程设置为 50,它将不会运行前 49 个请求,但会运行第 50 个请求并继续处理其余请求。我不太确定如何描述我遇到的问题,并且它没有给出任何错误。这只发生在使用 fasthttp 时,并且在 net/http 上工作得很好。这可能是 fasthttp 的问题吗? (这不是我的全部代码,只是我认为发生问题的区域)

threads := 50
    var lock sync.mutex
    semaphore := make(chan bool, threads)

    for len(userarray) != 0 {
        semaphore <- true
        go func() {
            lock.lock()
            var values []byte
            defer func() { <-semaphore }()
            fmt.println(len(userarray))
            if len(userarray) == 0 {
                return
            }
            values, _ = json.marshal(userarray[0])
            currentarray := userarray[0]
            userarray = userarray[1:]
            client := &fasthttp.client{
                dial: fasthttpproxy.fasthttphttpdialertimeout(proxy, time.second * 5),
            }
            time.sleep(1 * time.nanosecond)
            lock.unlock()

这是我得到的输出(数字是剩余的请求数量)

200
199
198
197
196
195
194
193
192
191
190
189
188
187
186
185
184
183
182
181
180
179
178
177
176
175
174
173
172
171
170
169
168
167
166
165
164
163
162
161
160
159
158
157
156
155
154
153
152
151
(10 lines of output from req 151)
150
(10 lines of output from req 150)
cont.

抱歉,如果我的解释令人困惑,我真的不知道如何解释这个错误


正确答案


我认为问题在于变量的范围。为了表示排队,我有一个并行工作线程池,它们全部从同一通道拉出,然后使用等待组等待它们。 确切的代码可能需要调整,因为我手头没有 go 编译器,但想法是这样的:

threads := 50
    queueSize := 100 // trying to add more into the queue will blocke

    semaphore := make(chan bool, threads)
    jobQueue := make(chan MyItemType, queueSize)

    var wg sync.WaitGroup

    func processQueue(jobQueue <- chan MyItemType) {
      defer wg.Done()
      for item := range jobQueue {
         values, _ = json.Marshal(item) // doesn't seem to be used?
         client := &fasthttp.Client{
            Dial: fasthttpproxy.FasthttpHTTPDialerTimeout(proxy, time.Second * 5),
         }
      }
    }

    for i := 0; i < threads; i++ {
      wg.Add(1)
      go processQueue(jobQueue)
    }
  
    close(jobQueue)
    wg.Wait()

现在您可以将项目放入 jobqueue 中,它们将由这些线程之一处理。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《第一个请求不在 goroutine 函数的开头发送》文章吧,也可关注编程网公众号了解相关技术文章。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯