小编kin*_*luo的帖子

golang:如何有效地模拟联合类型

众所周知,go没有联合类型,只能通过接口模拟.

我尝试了两种方法来模拟联合,但结果远不如C.

package main

import (
    "fmt"
    "time"
)

type U interface {
    i32() int32
    i16() int16
}

type i32 int32

func (u i32) i32() int32 {
    return int32(u)
}

func (u i32) i16() int16 {
    return int16(u)
}

type i16 int16

func (u i16) i32() int32 {
    return int32(u)
}

func (u i16) i16() int16 {
    return int16(u)
}

func test() (total int64) {
    type A struct {
        t int32
        u interface{}
    }
    a := [...]A{{1, int32(100)}, {2, int16(3)}} …
Run Code Online (Sandbox Code Playgroud)

go

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

grpc 服务器是否使用一个新的 goroutine 来处理一个方法调用?

golang grpc 实现是如何处理服务器并发的?

每个方法调用一个 goroutine?或者某种 goroutine 池?

是否依赖于net/http2的并发模型?

go grpc

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

筏子:承诺进入可能会丢失?

在所有关注者更新提交索引之前,领导者崩溃会发生什么?

例如,节点A,B,C形成集群:

  • 只有A和B活着,A是领导者

  • A将一个条目(比如说它的entry1)复制到B并从B获得成功的结果

  • 提交entry1,并在向B发送心跳消息之前崩溃(这会导致B更新其提交索引)

  • C现在在线

我的问题是:

  • C会被选为新领导人吗?如果是这样,那么entry1会丢失吗?此外,如果A重新加入,其数据将与其他数据不一致?

我知道筏子规格说:

Raft使用一种更简单的方法,它保证从选举之时起,每个新领导者都会出现之前条款中的所有已提交条目,而无需将这些条目转移给领导者.

但是这里的entry1可能不被视为已提交的条目?因为B没有得到老领导的确认(来自领导者的心跳).那么C有机会成为新的领导者吗?

  • 如果B成为新的领导者,那么它应该如何处理entry1?

raft

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

erlang:无法生成(节点,有趣):badfun错误

远程节点位于不同的计算机中.

我从本地节点测试:

$ erl -name foobar
Erlang/OTP 17 [erts-6.2] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Eshell V6.2  (abort with ^G)
(foobar@debian.localdomain)1> Aliyun='aliyun@localhost2.localdomain'.
'aliyun@localhost2.localdomain'
(foobar@debian.localdomain)2> spawn(Aliyun, fun() -> io:format("hello~n") end).
<6108.86.0>
(foobar@debian.localdomain)3> 
=ERROR REPORT==== 4-Jul-2015::21:03:27 ===
Error in process <0.86.0> on node 'aliyun@localhost2.localdomain' with exit value: {{badfun,#Fun<erl_eval.20.90072148>},[{erlang,apply,2,[]}]}


(foobar@debian.localdomain)3> spawn(Aliyun, io, format, ["hello~n"]).          
hello
<6108.87.0>
(foobar@debian.localdomain)4> net_adm:ping(Aliyun).
pong
Run Code Online (Sandbox Code Playgroud)

你可以看到它spawn(node,module,function,args)有效,但spawn(node,fun)事实并非如此.

远程节点上的Erlang版本是R15,而本地节点上的版本是R17.是原因吗?因为代码格式不同?我不清楚Erlang如何在将它传递给远程节点时编组有趣的类型.在字节码?

请帮忙!

erlang

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

mysql故障转移:如何选择slave作为新的master?

我是mysql新手.

当涉及到故障转移时,哪个奴隶应该被提升为新的主人?

例如,A是主服务器,B和C是从服务器,A执行到B和C的异步复制.

在某些时候,B从A接收的数据多于C,A崩溃.

如果我们将C提升为新的主人,并将B的主人改为C,那么B会发生什么?它截断其数据以匹配C?

显然,B是最好的新候选人,但我的问题是,如何确定这个事实呢?

mysql failover database-replication

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

raft:关于只读查询的一些问题

在 raft 的论文文档第 6.4 章中,给出了绕过 Raft 日志进行只读查询并仍然保持线性化的步骤:

\n\n
\n
    \n
  1. 如果领导者尚未将当前任期中的条目标记为已提交,它将等待直到完成此操作。领导者完整性属性保证领导者拥有所有已提交的条目,但在其任期开始时,它可能不知道这些条目是哪些。为了找出答案,\n 它需要从其术语中提交一个条目。Raft 通过让每个领导者在其任期开始时向日志中提交一个空白的无操作条目来处理此问题。一旦提交此无操作条目,领导者\xe2\x80\x99s\n 提交索引将至少与其任期内的任何其他服务器\xe2\x80\x99 一样大。
  2. \n
  3. 领导者将其当前提交索引保存在局部变量 readIndex 中。这将用作查询操作所针对的\n 状态版本的下限。
  4. \n
  5. 领导者需要确保它没有被它不知道的新领导者取代。它发出新一轮的心跳并等待大多数集群的确认。一旦收到这些确认,领导者就知道在发送心跳时,不可能存在更长时间的领导者。因此,readIndex 当时是集群中任何服务器见过的最大提交索引。
  6. \n
  7. 领导者等待其状态机至少前进到 readIndex;这足以满足线性化要求。
  8. \n
  9. 最后,领导者对其状态机发出查询,并将结果回复给客户端。
  10. \n
\n
\n\n

我的问题:

\n\n

a) 对于步骤1,是否仅适用于刚刚选举出领导者时的情况?因为只有新领导者在当前任期内没有承诺加入。并且由于无操作条目对于找出当前提交的条目是必要的,那么实际上在选举完成后总是需要这一步,而不仅仅是特定于只读查询?换句话说,通常,当领导者处于活动状态一段时间时,它必须在其任期内提交条目(包括无操作条目)。

\n\n

b) 对于步骤 3,这是否意味着只要领导者需要提供只读查询,就会发送一个额外的心跳,无论当前未完成的心跳(已发送但尚未收到主要响应)或下一个计划的心跳?

\n\n

c) 对于步骤 4,是否仅适用于关注者(对于关注者帮助卸载只读查询处理的情况)?因为在领导者上,提交的索引已经意味着它已应用于本地状态机。

\n\n

总而言之,正常情况下,领导者(活跃一段时间)只需要执行步骤3和步骤5,对吗?

\n

raft

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

golang:如何以最佳方式处理阻塞任务?

众所周知,goroutine 是同步但非阻塞的处理单元。golang 调度器很好地处理了非阻塞任务,例如套接字、定时器、信号或来自字符设备的其他事件。

但是块设备 io 或 CPU 敏感任务呢?它们在完成之前不能被中断,也不能被多路复用。运行 goroutine 的 OS 线程将冻结,直到 goroutine 返回或让步。在这种情况下,调度粒度变差。

当然,你可以在你的代码中将任务拆分成更小的子任务,例如,不要一次复制 1GB 的文件,而是先复制 10MB,然后再复制 10MB 等,以便其他 goroutine 在相同的操作系统线程有机会运行。CPU 密集型任务的另一个示例:部分压缩文件并最终合并它们。

但这破坏了顺序编程的便利性,与OS 线程上的OS 调度相比,手动调度难以均匀估计。

nginx 也有类似的问题,它是多进程程序,一个 CPU 核一个进程,类似于 GOMAXPROCS 的最佳实践。它引入线程池来处理阻塞任务。也许它对 golang 也有好处。我很好奇为什么golang没有OS线程API,这对于阻塞任务的goroutine应该是很好的补充。

go

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

Erlang中确切的类型数是多少?

除了你可以在其他语言中找到的数据原语和结构之外,Erlang中的完整类型列表是什么?

例如,套接字句柄的类型是什么?那ets处理怎么样?

而且,哪些类型不可能在节点之间进行序列化和交换?我认为套接字句柄必须是其中之一,对吧?

即使在同一节点内的进程中,套接字句柄也是共享的,对吧?那是无共享原则的例外吗?

GC对这种共享内容的行为是什么?什么是Erlang中的套接字实现?我认为这不是一个港口,对吧?

erlang

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

我们是否需要为链表手动创建析构函数?

我正在阅读学习Rust与完全太多链接列表,我很困惑为什么链表(堆栈)需要析构函数.

我认为当列表值超出范围时,列表本身和所有节点都将被清理.它只是为了演示吗?

我尝试使用和不使用手动析构函数对版本进行基准测试,我发现"没有析构函数"的版本具有更好的性能:

for _ in 1..30000000 {
        let mut list = List::new();
        list.push(1);
        assert_eq!(list.pop(), Some(1));
}
Run Code Online (Sandbox Code Playgroud)

使用手动析构函数:

real    0m11.216s
user    0m11.192s
sys     0m 0.020s
Run Code Online (Sandbox Code Playgroud)

没有手动析构函数:

real    0m9.071s
user    0m9.044s
sys     0m0.004s
Run Code Online (Sandbox Code Playgroud)

rust

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

为什么iter()将列表借用为不可变的?

使用完全过多的链接列表学习Rust时,iter()创建一个迭代器:

impl<T> List<T> {
    pub fn iter(&self) -> Iter<T> {
        Iter { next: self.head.as_ref().map(|node| &**node) }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试测试迭代器是否阻止对列表进行进一步修改:

let mut list = List::new();
list.push(1);

let mut iter = list.iter();
list.pop();
Run Code Online (Sandbox Code Playgroud)

编译器报告错误:

list2.rs:114:1: 114:5 error: cannot borrow `list` as mutable because it is also borrowed as immutable [E0502]
list2.rs:114 list.pop();
             ^~~~
list2.rs:113:24: 113:28 note: previous borrow of `list` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `list` until the borrow ends
list2.rs:113 …
Run Code Online (Sandbox Code Playgroud)

rust

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

标签 统计

go ×3

erlang ×2

raft ×2

rust ×2

database-replication ×1

failover ×1

grpc ×1

mysql ×1