go test可以用来做单元测试,-cover参数可以显示测试覆盖率。1
go test -v ./... -cover
结果如下:1
2
3...
PASS
coverage: 34.4% of statements
但是有时候需要提高覆盖测试率,就需要知道哪些代码被覆盖到了,而哪些代码没有被覆盖到。这时候可以借助go提供的一个工具来实现。
step by step
go test可以用来做单元测试,-cover参数可以显示测试覆盖率。1
go test -v ./... -cover
结果如下:1
2
3...
PASS
coverage: 34.4% of statements
但是有时候需要提高覆盖测试率,就需要知道哪些代码被覆盖到了,而哪些代码没有被覆盖到。这时候可以借助go提供的一个工具来实现。
elasticsearch索引一旦建立,就无法动态修改其字段的映射类型,有时候因为人为原因污染了索引的mapping,这个时候就只能通过重建索引来修改索引的mapping设置了。
在一次项目中,有一个字段结构如下:1
2
3
4
5
6{
"logistics":{
"company":"string",
"no":"string"
}
}
由于当初创建索引的时候,既没有给这个索引中的这个字段指定合适的类型,也没有通过动态模板来为这个字段指定类型,导致 elasticsearch 默认将这种结构的数据设置成了 Object 类型,而我们真正想要设置的类型却是 Nested 类型。
这种情况下,一般有两种解决方案。
最近使用python过程中遇到了一个看似诡异的问题,由于惯性思维,这个问题花了一点时间一步步调试才找到。
先来看看下面的代码的结果:1
2
3
4
5a = [1,2,3]
b = a
b.append(4)
print(b)
print(a)
如果这段代码放在其他语言,Java 或者 PHP 中,结果大多是这样的:1
2[1,2,3,4]
[1,2,3]
但是在 python 中,实际执行的结果却是这样的:1
2[1,2,3,4]
[1,2,3,4]
修改 b 的值,却影响了 a 的值。这个就是 python 和其他语言有一点不一样的地方了,简单可以理解为:python 没有赋值,只有引用。
如果以其他语言的方式来理解,那就是 a,b 都是指向同一块内存数据的地址,所以修改其中任何一个,都会引起彼此的变化,因为底层数据都是同一份。
现在,如果需要这段代码表现的和其他语言一致,该怎么写呢?
在 python 中使用 multiprocess 进行多线程或者多进程处理的时候,遇到了 gevent 问题:1
gevent.hub.LoopExit:('This operation would block forever....')
这个问题可以通过打上 monkey patch(猴子补丁)来规避。
在导入 multiprocess 库的文件头部加入以下代码:1
2
3from gevent import monkey
monkey.patch_all()
注意,这两行代码需要放置在文件导入库的最前面.
我遇到的场景下, 导致 LoopExit 的原因是 multiprocess 的job中远程网络请求超时导致的,如果相应的job任务中没有远程请求的话,即使不用 pathch,代码也是能够正常运行的。由于避免加上超时处理的复杂逻辑,就简单的使用monkey patch来解决这个问题。
在python 3.4及以上的版本中,可以通过 asyncio 来实现协程(coroutine)。在 python 3.5以后可以使用 async/await 来简化代码,如果python版本是3.4的话,需要通过 @asyncio.coroutine
注解 和 yield from
来实现。
一下代码是3.5+以后的写法,和3.4版本的写法主要区别在于:
1 |
|
参考:
廖雪峰的Python3.x教程-异步io