Open NathanFreeman opened 1 month ago
目前,多进程之间的协程同步只能通过Swoole\Lock或者通过flock函数对同一份文件加锁。Swoole\Lock没法在协程中使用,会阻塞当前进程。flock对文件加锁需要先打开文件,再对文件加锁。此时会发生两次协程切换。
多进程
Swoole\Lock
flock
io_uring
异步futex
sw_atomic_cmp_set
并发List
并发Map
并发Queue
SWOOLE_COROUTINE_LOCK
Swoole\Lock->lock()
Swoole\Lock->unlock()
$lock = new Lock(SWOOLE_COROUTINE_LOCK); $lock->lock(); $lock->unlock();
背景
目前,
多进程
之间的协程同步只能通过Swoole\Lock
或者通过flock
函数对同一份文件加锁。Swoole\Lock
没法在协程中使用,会阻塞当前进程。flock
对文件加锁需要先打开文件,再对文件加锁。此时会发生两次协程切换。协程锁
io_uring
提供的异步futex
特性和sw_atomic_cmp_set
函数,可以实现一个无需加锁的原子计数,可重入的互斥锁。并发List
,并发Map
和并发Queue
在并发写入时是使用互斥锁来保证线程安全的,线程获取不到锁的过程中会休眠。那么可以尝试用协程锁控制并发。API
Swoole\Lock
做兼容,增加一个SWOOLE_COROUTINE_LOCK
。Swoole\Lock->lock()
和Swoole\Lock->unlock()
,其他方法会返回false。缺点