有两种不同的方法来清理 goroutine。
使用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)用于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)去版本: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 …
我正在尝试设置 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个选项,open、close和error。当 Rails 应该是约定优于配置时,message为什么ActionCable看起来如此不传统?
谢谢
我注意到有两种方法可以在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。
目前我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) 我有一个 RTSP 源。数据以 NAL 单元流的形式出现。我认为 RTP 数据包需要“depay”或“解析”为 H.264 解码器可以理解的内容。
rtspsrc ! rtph264depay ! h264parse ! avdec_h264 ! ...
Run Code Online (Sandbox Code Playgroud)
depay 和 parse 之间的实际区别是什么?直觉上我觉得他们在做同样的事情。但如果我删除其中之一,Gstreamer 管道将无法工作。
go ×3
actioncable ×1
codec ×1
concurrency ×1
generics ×1
gorilla ×1
gstreamer ×1
h.264 ×1
tensorflow ×1