小编mof*_*ury的帖子

上下文包与完成通道以避免 goroutine 泄漏

有两种不同的方法来清理 goroutine。

  1. 使用kill 通道来发出取消信号,并使用done 通道来指示goroutine 已终止。

    type Worker struct {
      Done chan struct{}
      Kill chan struct{}
      Jobs chan Job
    }
    
    func (w *Worker) Run() {
      defer func() {
        w.Done <- struct{}{}
      }
      for {
        select {
        case <-w.Kill:
          return
        case j := <-w.Jobs:
          // Do some work
      }
    }
    
    go w.Run()
    w.Kill <- struct{}{}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用于context取消

    type Worker struct {
      Ctx context.Context
      Cancel context.CancelFunc
      Jobs chan Job
    }
    
    func (w *Worker) Run() {
      for {
        select {
        case <-w.Ctx.Done(): …
    Run Code Online (Sandbox Code Playgroud)

concurrency go

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

使用 Go 1.18 泛型,如何使用约束类型作为需要具体类型的函数的参数?

去版本:1.18

这是一个愚蠢的例子,并不是特别有用。我用它作为学习泛型的练习。

我有一个Pokemon界面

type Pokemon interface {
    ReceiveDamage(float64)
    InflictDamage(Pokemon)
}
Run Code Online (Sandbox Code Playgroud)

Charmander带有实现Pokemon接口的类型参数。

type Float interface {
    float32 | float64
}

type Charmander[F Float] struct {
    Health      F
    AttackPower F
}
Run Code Online (Sandbox Code Playgroud)

我想利用Charmander的攻击力来造成伤害。

func (c *Charmander[float64]) ReceiveDamage(damage float64) {
    c.Health -= damage
}

func (c *Charmander[float64]) InflictDamage(other Pokemon) {
    other.ReceiveDamage(c.AttackPower)
}
Run Code Online (Sandbox Code Playgroud)

我的编译器给出错误

无法使用 c.AttackPower(受 Float 约束的 float64 类型变量)作为 other.ReceiveDamage 编译器参数中的 float64 值(IncompleteAssign)

我已经将 struct generic 实例化为*Charmander[float64]. 我希望编译器知道AttackPower是一个float64.

当我将 a …

generics go

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

ActionCable 订阅创建方法的可用回调列表是什么?

我正在尝试设置 Rails 5ActionCable以将更新广播到我的数据库。到目前为止,我的工作进展顺利,但我意识到 ActionCable 的文档有点缺乏。对于我的情况,我想知道我可以放入函数中的回调列表subscriptions.create()

例如

const consumer = ActionCable.createConsumer();
consumer.subscriptions.create(
    'ChatsChannel'
    {
        received: someCallback,
        connected: otherCallback,
        disconnected: anotherCallback
    }
 )
Run Code Online (Sandbox Code Playgroud)

我注意到有appendLine并且createLine来自

第 5.4 节http://guides.rubyonrails.org/action_cable_overview.html

还有多少个?它们对应什么?这与 Node.js 和 Python 上常见的 websocket 非常不同。使用socket.io,我只得到4个选项,opencloseerror。当 Rails 应该是约定优于配置时,message为什么ActionCable看起来如此不传统?

谢谢

ruby-on-rails-5 actioncable

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

大猩猩/多路复用器中的 PathPrefix() 和 Handle(pathString, ...) 有什么区别?

我注意到有两种方法可以在gorilla/mux路由器中指定路径:

r.PathPrefix("/api").Handler(APIHandler)
Run Code Online (Sandbox Code Playgroud)

和:

r.Handle("/api", APIHandler)
Run Code Online (Sandbox Code Playgroud)

有什么不同?

另外,我不明白在gorilla/mux.

PathPrefix()返回一个路由,它有一个Handler()方法。但是,我们不能调用Handler()路由器,我们必须调用Handle().

看下面的例子:

r.PathPrefix("/").Handler(http.FileServer(http.Dir(dir+"/public")))
Run Code Online (Sandbox Code Playgroud)

我正在尝试从公共目录提供静态文件。上面的表达式没有任何问题。我的 HTML 和 JavaScript 按预期提供。但是,一旦我在路径中添加了一些东西,例如

r.PathPrefix("/home").Handler(http.FileServer(http.Dir(dir+"/public")))
Run Code Online (Sandbox Code Playgroud)

然后我收到 404, not found 错误localhost:<port>/home

go gorilla

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

如何加载图形检查点 (.ckpt) 并使用 SavedModelBuilder 将其保存为 protobuf 而不声明任何 tf.Variables?

目前我resnet_v2_50.ckpt来自 tensorflow 的开源预训练模型。我正在尝试在 Go 中提供此模型,因为我的 Web 应用程序的后端将使用 Go。如果我要创建自己的模型并训练它,然后保存它。我在 Go 中提供它没有问题,但我正在尝试使用预先训练的模型来节省我的时间。

这是我如何保存模型的简单示例

mnist = input_data.read_data_sets(DATA_DIR, one_hot=True)

# Recall that each image is 28x28
x = tf.placeholder(tf.float32, [None, 784], name='imageinput')
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.add(tf.matmul(x, W), b)
labels = tf.placeholder(tf.float32, [None, 10])
cross_entropy_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy_loss)

with tf.Session() as sess:
    with tf.device("/cpu:0"):
        sess.run(tf.global_variables_initializer())
        for i in range(1000):
            batch_x, batch_label = mnist.train.next_batch(100)
            loss, _ = sess.run([cross_entropy_loss, train_step], feed_dict={x: batch_x, labels: batch_label})
            print '%d: …
Run Code Online (Sandbox Code Playgroud)

deep-learning tensorflow pre-trained-model

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

GStreamer 世界中的 H.264 depay 和 H.264 parse 有什么区别?

我有一个 RTSP 源。数据以 NAL 单元流的形式出现。我认为 RTP 数据包需要“depay”或“解析”为 H.264 解码器可以理解的内容。

rtspsrc ! rtph264depay ! h264parse ! avdec_h264 ! ...
Run Code Online (Sandbox Code Playgroud)

depay 和 parse 之间的实际区别是什么?直觉上我觉得他们在做同样的事情。但如果我删除其中之一,Gstreamer 管道将无法工作。

codec gstreamer h.264 gstreamer-1.0

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