把任务队列 delayed 移植到 Go 了

标签:Go

4 年前我用 Python 写了个叫 delayed 的任务队列,经过几年发展后,公司有了 Go 和 Python 相互调用的需求。
目前的 delayed 实现是用 pickle 来做序列化的,其实之前也写过用 JSON 来做序列化的版本,但是遇到了几个问题:
  1. JSON 会丢失一些对象类型,例如无法区分 tuple 和 list。
  2. JSON 无法直接编码二进制字符串(bytes)。
  3. JSON 不支持原本 pickle 能支持的很多类型。
当时因为这些问题我就放弃了,但是现在看来,这些问题有的可以解决,有的可以容忍,所以还是决定开发 Go 的版本。

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 可是专门为并发安全而设计的,难道直接调用它的接口也会出现线程冲突?

造了个 Go 语言的日志轮子:golog

标签:Go

工作中用了半年多的 Go 语言,慢慢对这门语言熟悉起来了。虽然仍经常免不了要吐槽它的各种问题,但最令我意外的是一个发布 9 年多的语言,居然没有一款符合我心意的日志库。

我总结了一下我的需求:
  • 输出无结构的日志,方便人工读取。
  • 可同时输出到屏幕和文件。
  • 可输出日志的等级。
  • 可输出日志所在的源文件和行号。
  • 可订制日志样式。
  • 支持日志轮转。
  • 跨平台。
  • 高性能。
第一点基本能刷掉 Github 上前 3 页的日志库了,似乎都是格式化成 JSON 的。第四点也能干翻不少库,很少有支持的。所以一气之下只好自己造轮子了。

使用 Go 语言实现苹果推送通知服务客户端

标签:Go

注:本文拖了 10 多天了,因为被更想做的事吸引了,暂时没空补完了,所以先发个粗糙的版本吧。

因为刚学 Go 语言,自然得写点什么练练手。
之前自己用 Python 实现过比较简单的苹果推送服务(主要就是根据请求,构造并发送给 Apple Push Notification service),加上 Go 擅长服务器端编程,所以决定也写一个试试。不过整个服务依赖性比较大,这里就只做客户端的部分了。

Go 语言设计得还真敷衍

标签:Go

五年前 Google 推出 Go 语言时,我曾花了几小时的时间把它的语法粗看了一遍,总体感觉是比较乱。
可看到近来 Go 的好评如潮,我还是忍不住又重新学习了一遍。
给我的感觉是几乎每一个语法都没有好好思考,只在某些时候看上去不错,但另一些时候则非常不优雅。

Google推出Go语言

标签:Go

昨天Google推出了Go语言,拥有接近于C的速度,并专门针对多核处理器进行了优化。