标签: channel

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

一个通道可能被多个 Go 例程使用。使用某些 Go 例程中的 len(channel) 获取通道的长度是线程安全的吗?

channel thread-safety go

1
推荐指数
1
解决办法
2445
查看次数

UnresolvedAddressException 套接字通道

UnresolvedAddressException我正在尝试在我的计算机和远程服务器之间创建一个套接字,但执行此操作时出现错误:

    InetSocketAddress hostAddress = new InetSocketAddress("http://www.google.com", 80);
    SocketChannel serverChannel = SocketChannel.open(hostAddress);
Run Code Online (Sandbox Code Playgroud)

这是为什么?

java sockets nio channel

1
推荐指数
1
解决办法
3735
查看次数

如何将电报机器人添加到我不是管理员的公共频道?

如何将我的电报机器人添加到我不是管理员的电报频道中?该频道是单向通信(管理员发送消息,每个人都收到但无法回复群组)。

在 11 月 21 日 Bot API 的更改日志(https://core.telegram.org/bots/api-changelog#november-21-2016)中,第二个要点显示“您的机器人现在可以获得有关帖子的更新在频道中。在更新中添加了新字段channel_post和edited_channel_post。”

这是否意味着我的机器人可以从渠道接收消息并根据它们采取行动?如果是这样,如果管理员没有帮助我添加机器人,我该如何将机器人添加到组中?

我在这里和其他地方搜索过问题的答案,但大多数人似乎都说只有管理员可以添加机器人。这是因为信息已过时,还是仍然无法添加机器人?顺便说一句,我正在使用 python。

感谢您的时间和帮助,

python api bots channel telegram

1
推荐指数
1
解决办法
3510
查看次数

从 Go 中的通道接收值

为什么不将go sum(s[len(s)/2:], c)(第二个)返回的最后一个结果分配给x?这两个<-c让我很困惑。此代码来自A Tour of Go - [Channels]

package main

import "fmt"

func sum(s []int, c chan int) {   // int is the return value type
  sum := 0
  for _, v := range s {
    sum += v
  }
  c <- sum // Sends sum to c
}

func main() {
  s := []int{7, 2, 8, -9, 4, 0}

  c := make(chan int)
  go sum(s[:len(s)/2], c)
  go sum(s[len(s)/2:], c)

  x, y …
Run Code Online (Sandbox Code Playgroud)

channel go goroutine

1
推荐指数
1
解决办法
1701
查看次数

Golang并发,批量处理item

我正在编写一个程序来处理文本文件中的数百万行,500k 需要 5 秒来验证文件,我想加快速度。

我想循环遍历这些项目并异步处理其中的 x,然后等待响应以查看是否应该继续。

我写了一些虚拟代码,我不确定我写的是否有意义,它看起来相当复杂,是否有一种更简单更优雅的方法来做到这一点。

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    // Need an object to loop over
    // need a loop to read the response
    items := 100000
    concurrency := 20
    sem := make(chan bool, concurrency)
    returnChan := make(chan error)
    finChan := make(chan bool)

    var wg sync.WaitGroup

    go func() {
        for x := 0; x < items; x++ {
            // loop over all items
            // only do maxitems at a time
            wg.Add(1) …
Run Code Online (Sandbox Code Playgroud)

concurrency channel go

1
推荐指数
1
解决办法
8773
查看次数

如何优雅地关闭 golang 服务器?

在构建自定义服务器应用程序时,最好有一个关闭机制,以确保所有正在运行的进程在服务器关闭之前停止,这也将有助于更好的内存管理。

我们如何利用 Golang 及其力量来构建这样的机制?Golang 中已经有一个 ,shutdown函数可用,我的目的是让开发人员跳出框框思考并创建多种方法来执行相同的操作。这将有助于让我们的golang社区变得更好、更强。下面我分享一下我的一个答案,希望大家多提建议和解答。

shutdown channel go goroutine server

1
推荐指数
1
解决办法
8673
查看次数

Why declaring a channel in global scope gives deadlock issue

Out of 3 code snippets, the one with channels declared in local scope works, other code snippets gives deadlock issue, One of the previously answered SO question here says try to avoid declaring channel in the global scope. I checked in the official docs, but I didn't find any explanation.

  1. Why is the global scope channel giving an error although I am not blocking the channel from sending and receiving? why am I getting a deadlock issue here?

  2. How …

concurrency deadlock scope channel go

1
推荐指数
1
解决办法
49
查看次数

了解 goroutines 同步

我正在尝试了解 golang频道同步。当我运行我的程序与竞争检测器,它导致了比赛的检测。

我的程序:

func main() {
    ch := make(chan int)
    done := make(chan struct{})
    wg := sync.WaitGroup{}

    go func() {
        defer close(ch)
        defer close(done)
        wg.Wait()
        done <- struct{}{}
    }()

    for i := 0; i < 5; i++ {
        x := i
        wg.Add(1)
        go func() {
            defer wg.Done()
            fmt.Println("Value: ", x)
            ch <- x
        }()
    }
    
loop:
    for {
        select {
        case i := <-ch:
            fmt.Println("Value: ", i)
        case <- done:
            break loop
        }
    } …
Run Code Online (Sandbox Code Playgroud)

channel go goroutine waitgroup

1
推荐指数
1
解决办法
107
查看次数

多个 goroutine 有选择地在一个通道上监听

我已经看过这个这个这个这个,但在这种情况下没有一个真正帮助我。如果通道中的值是针对该特定 goroutine 的,我有多个 goroutine 需要执行某些任务。

var uuidChan chan string

func handleEntity(entityUuid string) {
    go func() {
        for {
            select {
            case uuid := <-uuidChan:
                if uuid == entityUuid {
                    // logic
                    println(uuid)
                    return
                }
            case <-time.After(time.Second * 5):
                println("Timeout")
                return
            }
        }
    }()
}

func main() {
    uuidChan = make(chan (string))
    for i := 0; i < 5; i++ {
        handleEntity(fmt.Sprintf("%d", i))
    }
    for i := 0; i < 4; i++ { …
Run Code Online (Sandbox Code Playgroud)

channel go goroutine

1
推荐指数
1
解决办法
108
查看次数

select 语句能保证通道选择的顺序吗?

此答案之后,如果一个 goroutine 在两个通道上进行选择,是否可以保证以与发送通道相同的顺序选择通道?我对发件人是单线程的情况特别感兴趣。

例如,是否保证此代码始终产生相同的输出:

package main

import (
  "fmt"
  "time"
)

var x, y chan int

func worker() {
  for {
    select {
    case v := <- x:
      fmt.Println(v)
    case v := <- y:
      fmt.Println(v)
    }
  }
}

func main() {
  x = make(chan int)
  y = make(chan int)
  go worker()
  x <- 1
  y <- 2
  <- time.After(1 * time.Second)
}
Run Code Online (Sandbox Code Playgroud)

我的实验似乎表明,这对于无缓冲通道是有保证的,如图所示,但对于缓冲通道则不能保证。有人可以确认吗?

channel go goroutine

1
推荐指数
2
解决办法
95
查看次数