标签: channels

如何阻止goroutine

我有一个调用方法的goroutine,并在通道上传递返回值:

ch := make(chan int, 100)
go func(){
    for {
        ch <- do_stuff()
    }
}()
Run Code Online (Sandbox Code Playgroud)

我怎么停止这样的goroutine?

go goroutine channels

90
推荐指数
6
解决办法
9万
查看次数

通道是否隐式通过引用传递

go tour有这个例子用于频道:https://tour.golang.org/concurrency/2

package main

import "fmt"

func sum(a []int, c chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    c <- sum // send sum to c
}

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

    c := make(chan int)
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
}
Run Code Online (Sandbox Code Playgroud)

在sum函数中修改通道c,并且在函数终止后更改仍然存在.显然c是通过引用传递的,但没有创建指向c的指针.是否通过引用隐式传递了通道?

concurrency pass-by-reference go channels

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

为什么在同一个goroutine中使用无缓冲通道会导致死锁

我确信这个微不足道的情况有一个简单的解释,但我是go并发模型的新手.

当我运行这个例子

package main

import "fmt"

func main() {
    c := make(chan int)    
    c <- 1   
    fmt.Println(<-c)
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
    /home/tarrsalah/src/go/src/github.com/tarrsalah/tour.golang.org/65.go:8 +0x52
exit status 2
Run Code Online (Sandbox Code Playgroud)

为什么?


包装c <-在一个goroutine使得示例运行正如我们预期的那样

package main

import "fmt"

func main() {
    c := make(chan int)        
    go func(){
       c <- 1
    }()
    fmt.Println(<-c)
}
Run Code Online (Sandbox Code Playgroud)

再次,为什么?

请,我需要深入解释,而不仅仅是如何消除死锁并修复代码.

concurrency go channels

46
推荐指数
3
解决办法
2万
查看次数

不同conda频道的说明

什么是主要的康茄达频道,他们的重点是什么?我似乎无法找到任何主要渠道可用的文件以及何时选择其中一个.与"默认"频道的关系是什么?如何确定将它们放入的顺序?一般来说,我用

  • anaconda
  • conda_forge
  • r
  • bioconda
  • defaults

但是我在破坏环境时遇到了一些问题.

channels anaconda conda miniconda

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

Django渠道与芹菜有何不同?

最近我开始了解Django频道.有人可以告诉我通道和芹菜之间的区别,以及芹菜和渠道的使用位置.

django celery channels

19
推荐指数
5
解决办法
6687
查看次数

golang使用频道超时

我正在使用goroutines/channels来检查网址列表是否可以访问.这是我的代码.这似乎总是回归真实.为什么超时案例没有被执行?即使其中一个网址无法访问,目标也是返回false

import "fmt"
import "time"

func check(u string) bool {
    time.Sleep(4 * time.Second)
    return true
}

func IsReachable(urls []string) bool {

    ch := make(chan bool, 1)
    for _, url := range urls {
        go func(u string) {
            select {
            case ch <- check(u):
            case <-time.After(time.Second):
                ch<-false
            }
        }(url)
    }
    return <-ch
}
func main() {
    fmt.Println(IsReachable([]string{"url1"}))
}
Run Code Online (Sandbox Code Playgroud)

go channels

15
推荐指数
2
解决办法
2万
查看次数

如何检测用户是否因网络断开而离开Phoenix通道?

我有一个Elixir/Phoenix服务器应用程序,客户端通过websockets通过内置通道系统连接.现在我想检测用户何时离开频道.

旁注:我正在使用Google Chrome扩展程序中的javascript客户端库.为此,我从Phoenix中提取了ES6代码,将其转换为javascript,并稍微调整一下,使其独立运行.

现在当我关闭弹出窗口时,服务器立即触发该terminate/2功能reason = {:shutdown, :closed}.扩展端没有任何关闭回调,所以这很棒!

但是,当客户端只是失去网络连接(我连接第二台计算机,只是拉出网络插头),然后terminate/2将不会触发.

为什么以及如何解决此问题?

我玩了timeout选择,transport :websocket, Phoenix.Transports.WebSocket但这没有成功.

更新: 使用新的真棒凤凰1.2的Presence东西,这不再需要了.

elixir websocket channels phoenix-framework

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

如何从OpenCV 2中获取图像的通道数?

答案我可以确定cv :: Mat Opencv中的通道数为OpenCV 1回答这个问题:你使用Mat.channels()图像的方法.

但是在cv2(我使用2.4.6)中,我所拥有的图像数据结构没有channels()方法.我正在使用Python 2.7.

代码段:

cam = cv2.VideoCapture(source)
ret, img = cam.read()
# Here's where I would like to find the number of channels in img.
Run Code Online (Sandbox Code Playgroud)

互动尝试:

>>> img.channels()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'channels'
>>> type(img)
<type 'numpy.ndarray'>
>>> img.dtype
dtype('uint8')
>>> dir(img)
['T',
 '__abs__',
 '__add__',
...
 'transpose',
 'var',
 'view']
# Nothing obvious that would expose the …
Run Code Online (Sandbox Code Playgroud)

python opencv image channels

12
推荐指数
2
解决办法
3万
查看次数

使用django频道时如何使用Channel而不是Group?

我正试图在django上使用渠道项目(http://channels.readthedocs.org/en/latest/index.html).

虽然在文档上有一个很好的教程,用于构建基于Group的websocket应用程序(聊天),我找不到与客户特定的简单推送机制相关的东西(所以不需要使用Group)

假设我想要与各种新闻提供者一起构建一个feed聚合器,当用户访问主页并等待所有的feed被解析时,我想向他发送关于服务器正在解析哪一个的信息性消息,而他等待.

我现在得到的是:consumers.py

from channels import Group, Channel
from .views import sort_articles_by_date
from .soup import ProviderParser
from .models import Provider


# Connected to websocket.connect and websocket.keepalive
def ws_add(message):
    Group("news_providers_loading").add(message.reply_channel)

def ws_message(message):
    providers = Provider.objects.all()

    articles = []
    for provider in providers:
        Group("news_providers_loading").send({'content': str(provider)})
        parser = ProviderParser(provider)
        articles.extend(parser.parse_articles())

     sort_articles_by_date(articles)


 # Connected to websocket.disconnect
 def ws_disconnect(message):
     Group("news_providers_loading").discard(message.reply_channel)
Run Code Online (Sandbox Code Playgroud)

routing.py

channel_routing = {
    "websocket.connect": "news_providers.consumers.ws_add",
    "websocket.keepalive": "news_providers.consumers.ws_add",
    "websocket.receive": "news_providers.consumers.ws_message",
    "websocket.disconnect": "news_providers.consumers.ws_disconnect",
}
Run Code Online (Sandbox Code Playgroud)

虽然它工作正常,但我觉得这有点矫枉过正(?)有没有办法只使用Channel构造函数而不是Group?

谢谢 :)

python django asynchronous push channels

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

如何关闭多个goroutines正在发送的频道?

我试图并行进行一些计算.该程序的设计使每个工作者goroutine将已解决的谜题的"碎片"发送回控制器goroutine,等待接收和组装从工作程序发送的所有内容.

什么是关闭单一频道的idomatic Go?我不能在每个goroutine的频道上打电话,因为那时我可以发送一个封闭的频道.同样,没有办法预先确定哪个goroutine会先完成.这里需要sync.WaitGroup吗?

go channels

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