直接 zk 或者 etcd 做不就行了....为什么折腾 pg
数据库做锁没法支持连接断开后清理锁,用 expire_at 很别扭的
字段里加个 lokcer 存放 uuid, 这个 uuid 由于获得上锁的客户端生成, 由于这个 uuid 只有上锁的客户端才知道,这样就可以做到过期前只有指定的 locker 才能释放
上锁
update lock set locker = 'fffffffffffffffffffffffffffffffffffff' where id = 'locker-id' and locker is null
放锁
update lock set locker = null where id = 'locker-id' and locker = 'fffffffffffffffffffffffffffffffff'
linux 下 append 写入,是原子性,多进程安全的
你的问题应该不是多进程的安全问题
基于时间的文件归档有问题的话,多半是你们滚日志的时候只有主进程做了重新打开日志文件的操作
正确流程是发信号到进程组,所有进程组内所有进程都重新打开日志文件
对于协程实现框架来说, 在一个以时间为排序 key 的队列里排序
对于系统和底层来说, 一般是通过保存上下文实现
就本质来说,协程解决的是遇到 io 时切换到其他其他代码片段、等 io 完成后切换回来
要实现上述代码,如果不用类似线程的语法、那么就你的代码就是一但开始 io, 就得 goto 来 goto 去,这样的代码根本没法写
协程的框架、或者说协程的语法,就是把上述 goto 来 goto 去的实现到框架内部,让业务代码可以常规语法差不多
把一个协程框架代码读懂来就不会有那么多疑问了,那种带 c 或者汇编的不好读,可以读 python 的 eventlet,这套代码除了上下文保存部分用了 c,其他都是纯 python 代码