赞
踩
格式化字符串是开发人员经常要进行操作,无论是返回错误还是记录消息。但在处理并发应用程序时,开发人员很容易忘记字符串格式化带来的潜在副作用。下面将看到两个具体示例:一个是读取etcd存储导致数据竞争,另一个是导致死锁的情况。
1. etcd数据竞争
etcd是一个用Go实现的分布式键值存储,它在包括Kubernetes在内在的许多项目中用于存储所有集群数据。它提供了与集群交互的API。例如,Watcher接口用于接收数据变化的通知:
- type Watcher interface {
- / Watch watches on a key or prefix. The watched events will be returned
- / through the returned channel.
- / ...
- Watch(ctx context.Context, key string, opts ...OpOption) WatchChan
- Close() error
- }
API 依赖于gRPC流。gRPC流是一种在客户端和服务器之间不断交换数据的技术。服务器必须维护使用此功能的所有客户端的列表。因此,Watcher接口由包含所有活动流的watcher结构体实现:
- type watcher struct {
- / ...
-
- / streams hold all the active gRPC streams keyed by ctx value.
- streams map[string]*watchGrpcStream
- }
map的键基于调用Watch方法时提供的上下文:
func (w *watcher) Watch
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。