javasgl

step by step


  • Home

  • Archives

  • Tags

  • Categories

  • About

  • Search

go覆盖测试率图形化分析

Posted on 2018-05-23 | In go | Visitors

go test可以用来做单元测试,-cover参数可以显示测试覆盖率。

1
go test -v ./... -cover

结果如下:

1
2
3
...
PASS
coverage: 34.4% of statements

但是有时候需要提高覆盖测试率,就需要知道哪些代码被覆盖到了,而哪些代码没有被覆盖到。这时候可以借助go提供的一个工具来实现。

Read more »

使用 reindex 来修改 elasticsearch 索引mapping

Posted on 2018-04-02 | In elasticsearch | Visitors

elasticsearch索引一旦建立,就无法动态修改其字段的映射类型,有时候因为人为原因污染了索引的mapping,这个时候就只能通过重建索引来修改索引的mapping设置了。

在一次项目中,有一个字段结构如下:

1
2
3
4
5
6
{
"logistics":{
"company":"string",
"no":"string"
}
}

由于当初创建索引的时候,既没有给这个索引中的这个字段指定合适的类型,也没有通过动态模板来为这个字段指定类型,导致 elasticsearch 默认将这种结构的数据设置成了 Object 类型,而我们真正想要设置的类型却是 Nested 类型。

这种情况下,一般有两种解决方案。

Read more »

python的浅复制和深复制

Posted on 2018-03-30 | In python | Visitors

最近使用python过程中遇到了一个看似诡异的问题,由于惯性思维,这个问题花了一点时间一步步调试才找到。
先来看看下面的代码的结果:

1
2
3
4
5
a = [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 都是指向同一块内存数据的地址,所以修改其中任何一个,都会引起彼此的变化,因为底层数据都是同一份。

现在,如果需要这段代码表现的和其他语言一致,该怎么写呢?

Read more »

python monkey patch解决gevent block forever问题

Posted on 2018-03-12 | In python | Visitors

在 python 中使用 multiprocess 进行多线程或者多进程处理的时候,遇到了 gevent 问题:

1
gevent.hub.LoopExit:('This operation would block forever....')

这个问题可以通过打上 monkey patch(猴子补丁)来规避。

在导入 multiprocess 库的文件头部加入以下代码:

1
2
3
from gevent import monkey

monkey.patch_all()

注意,这两行代码需要放置在文件导入库的最前面.

我遇到的场景下, 导致 LoopExit 的原因是 multiprocess 的job中远程网络请求超时导致的,如果相应的job任务中没有远程请求的话,即使不用 pathch,代码也是能够正常运行的。由于避免加上超时处理的复杂逻辑,就简单的使用monkey patch来解决这个问题。

python asyncio 简单使用

Posted on 2018-03-07 | In python | Visitors

在python 3.4及以上的版本中,可以通过 asyncio 来实现协程(coroutine)。在 python 3.5以后可以使用 async/await 来简化代码,如果python版本是3.4的话,需要通过 @asyncio.coroutine注解 和 yield from 来实现。

一下代码是3.5+以后的写法,和3.4版本的写法主要区别在于:

  1. 用 async 代替了 @asyncio.coroutine
  2. 用 await 代替了 yield from
1
2
3
4
5
6
7
8
9
10
11
12
13
14

import asyncio

async def task(n):
print("do task:",n)
await asyncio.sleep(1)

tasks = [ task(_) for _ in range(10)]

loop = asyncio.get_event_loop()
res, _ = loop.run_until_complete(asyncio.wait(tasks))
loop.close()
for _ in res:
print(_.result())

参考:
廖雪峰的Python3.x教程-异步io

1234…12
javasgl

javasgl

A journey of a thousand miles begins with single step

60 posts
13 categories
94 tags
RSS
GitHub Wechat
© 2020 javasgl
Powered by Hexo
Theme - NexT.Mist
0%