sync.Map 不是线程安全的?

标签:Go

昨天在压测公司的项目时发现,sync.(*Map).Store() 抛了个异常,日志如下:
fatal error: sync: unlock of unlocked mutex

goroutine 63756060 [running]:
runtime.throw({0xbeeca9, 0xb45120})
#011/usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc0010f13a0 sp=0xc0010f1370 pc=0x4336d1
sync.throw({0xbeeca9, 0xb2dd40})
#011/usr/local/go/src/runtime/panic.go:1184 +0x1e fp=0xc0010f13c0 sp=0xc0010f13a0 pc=0x45ecfe
sync.(*Mutex).unlockSlow(0x11d45a0, 0xffffffff)
#011/usr/local/go/src/sync/mutex.go:196 +0x3c fp=0xc0010f13e8 sp=0xc0010f13c0 pc=0x47851c
sync.(*Mutex).Unlock(...)
#011/usr/local/go/src/sync/mutex.go:190
sync.(*Map).Store(0x11d45a0, {0xae4960, 0xc0012f4350}, {0xae40e0, 0xc000026078})
#011/usr/local/go/src/sync/map.go:163 +0x465 fp=0xc0010f1480 sp=0xc0010f13e8 pc=0x476fa5
要知道这可是 Go 的官方库,sync.Map 可是专门为并发安全而设计的,难道直接调用它的接口也会出现线程冲突?

Docker 镜像拼接技术

标签:Docker

公司的服务是 Docker 搭建的,给客户升级时存在一个问题:镜像太大了。
虽然我已经找了很多方法,甚至对于 Go 服务而言,已经全换成 scratch 镜像 + 单可执行文件的方式了,但是对于 Python 服务却没啥办法。大部分的 Python 库是有 C 库依赖的,因此不能用 scratch 镜像,甚至因为 alphine 镜像不是用 libc,也会出现很多兼容性问题。而在 Ubuntu 的基础上安装完依赖后,就轻松超过 300 MB 了。
因为不能在客户那搭建一个 docker repository 把镜像推过去,那只能想些奇技淫巧来实现了。

关于本站被墙的一些分析

标签:无

自从本站被墙之后,我也好久没更新博客了。
今天稍微看了一下,似乎是域名被封了,现象有:
  1. nslookup 随机解析到其他无法访问的 IP。
  2. 改本地 /etc/hosts 后,curl 报 35 错误(SSL connect error. The SSL handshaking failed.),openssl 可以正常连接 443 端口,但带了 -servername 参数后失败。
  3. 改本地 /etc/hosts 后,用 HTTP 可以访问。
  4. 换域名可以访问。
  5. 换端口的 HTTPS 不可以访问。

Python 3.8 支持只接受位置参数了

标签:Python

今天在看 functools.cache 的源码时发现参数列表有个诡异的 /
def cache(user_function, /):
    'Simple lightweight unbounded cache.  Sometimes called "memoize".'
    return lru_cache(maxsize=None)(user_function)
翻了下文档才发现这个叫 Positional-Only Parameters

跨机器使用 Docker 构建的缓存

标签:Docker

在使用 GitLab CI 时,我经常被漫长的构建时间影响工作效率,尤其是在一台机器上已经 docker build 过的镜像,另一台机器上却需要重新构建,没法利用缓存。
查了一番文档后,我发现 docker build 还能使用外部缓存来加速构建。

Python 源码保护的自动化构建方案

标签:Docker, Python

Python 源码保护的方案主要有代码混淆、修改解释器和编译成二进制这三种,其他方式基本没有保护效果。而这三种方案中,最安全的就是用 Cython 来编译 py 文件(但是需要注意兼容性)。

GitLab CI 使用 Docker in Docker 无法访问 services 的坑

标签:Docker

昨天在给一个新项目写 .gitlab-ci.yml 配置时,发现一个域名无法解析的问题,部分配置如下:

variables:
  MYSQL_DATABASE: test
  MYSQL_ROOT_PASSWORD: test

test:
  stage: test
  services:
    - mysql:5.7
    - redis:4
  script:
    - apk update && apk add mysql-client
    - mysql -h mysql -u root -ptest < init.sql
    - docker build -t test .
    - docker run -t test pytest tests

我的投资观

标签:无

在我看来,这个世界上最有用的知识其实都是很简单的,投资也是如此。不过简单的东西反而少有人懂,更甭提认可并去实践了,这大概就是余额宝的收益率就能长期持续稳定战胜 90% 以上的支付宝财友的原因吧。

« 看看还有什么好玩意