多进程在Swoole中是一个很重要的话题,即是协程机制也是依赖于进程。所以Swoole\Lock让大家在PHP 代码中可以很方便地创建一个锁,用来实现数据同步。Lock 类支持以下 5 种锁的类型:

示例:

$lock = new Swoole\Lock(SWOOLE_MUTEX);
echo "[Master]create lock\n";
$lock->lock();
if (pcntl_fork() > 0)
{
sleep(1);
$lock->unlock();
}
else
{
echo "[Child] Wait Lock\n";
$lock->lock();
echo "[Child] Get Lock\n";
$lock->unlock();
exit("[Child] exit\n");
}
echo "[Master]release lock\n";
unset($lock);
sleep(1);
echo "[Master]exit\n";

注意:

- 请勿在 onReceive 等回调函数中创建锁,否则内存会持续增长,造成内存泄漏。

- 在协程中无法使用锁,请谨慎使用,不要在 lock 和 unlock 操作中间使用可能引起协程切换的 API。

成员函数

1) __construct():构造函数

Swoole\Lock::__construct(int $type = SWOOLE_MUTEX, string $lockfile = '');

$type:锁的类型

$lockfile:指定文件锁的路径【当类型为 SWOOLE_FILELOCK 时必须传入】(博主注:就文档所示,FILELOCK已经被废弃,这个参数相当于没用了)

注意:

- 不要循环创建 / 销毁锁的对象,否则会发生内存泄漏。

- 每一种类型的锁支持的方法都不一样。如读写锁、文件锁可以支持 $lock->lock_read()。另外除文件锁外,其他类型的锁必须在父进程内创建,这样 fork 出的子进程之间才可以互相争抢锁。

2) lock():加锁操作。如果有其他进程持有锁,那这里将进入阻塞,直到持有锁的进程 unlock() 释放锁。

Swoole\Lock->lock(): bool

3) locklock():加锁操作。与 lock 方法不同的是,trylock() 不会阻塞,它会立即返回。

woole\Lock->trylock(): bool

返回值:加锁成功返回 true,此时可以修改共享变量;加锁失败返回 false,表示有其他进程持有锁

注:SWOOlE_SEM 信号量没有 trylock 方法

4) unlock():释放锁

Swoole\Lock->unlock(): bool

5) lock_read():只读加锁

Swoole\Lock->lock_read(): bool

注意:

- 在持有读锁的过程中,其他进程依然可以获得读锁,可以继续发生读操作;

- 但不能 $lock->lock() 或 $lock->trylock(),这两个方法是获取独占锁,在独占锁加锁时,其他进程无法再进行任何加锁操作,包括读锁;

- 当另外一个进程获得了独占锁 (调用 $lock->lock()/$lock->trylock()) 时,$lock->lock_read() 会发生阻塞,直到持有独占锁的进程释放锁。

- 只有 SWOOLE_RWLOCK 和 SWOOLE_FILELOCK 类型的锁支持只读加锁

6) trylock_read():加锁。此方法与 lock_read() 相同,但是非阻塞的。

Swoole\Lock->trylock_read(): bool

注:调用会立即返回,必须检测返回值以确定是否拿到了锁。

7) lockwait():加锁操作。作用与 lock() 方法一致,但 lockwait() 可以设置超时时间。

Swoole\Lock->lockwait(float $timeout = 1.0): bool

$timeout:指定超时时间,单位:秒【支持浮点型,如 1.5 表示 1s+500ms】

返回值:在规定的时间内未获得锁,返回 false;加锁成功返回 true

注:只有 Mutex 类型的锁支持 lockwait

---------------------------  我是可爱的分割线  ----------------------------

最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

Swoole从入门到入土(26)——多进程[进程间锁]的更多相关文章

  1. Swoole 中使用 Table 内存表实现进程间共享数据

    背景 在多进程模式下进程之间的内存是相互隔离的,在一个工作进程中的全局变量和超全局变量,在另一个工作进程中是无法读取和操作的. 如果只有一个工作进程,则不存在进程隔离问题,可以使用全局变量和超全局变量 ...

  2. Python多进程-进程间数据的共享

    不同的进程不能同时修改一份数据,但是不同的进程能对一份数据进行修改 可通过Manager来实现进程间的数据共享 # -*- coding:utf-8 -*- __author__ = "Mu ...

  3. Python多进程-进程间数据的传递

    两个进程间的数据是独立的,要进行数据传递的话可通过几个方法 Queue 通过队列来进行进程间数据的传递 # -*- coding:utf-8 -*- __author__ = "MuT6 S ...

  4. Swoole 中使用 Lock 实现进程间锁

    注意:不要在 lock 和 unlock 操作中间使用可能引起协程切换的 API. $lock = new Swoole\Lock(SWOOLE_MUTEX); echo "[Master] ...

  5. pthread mutex 进程间互斥锁实例

    共享标志 定义 名称 描述 0 PTHREAD_PROCESS_PRIVATE 进程内互斥锁 仅可当前进程内共享 1 PTHREAD_PROCESS_SHARED 进程间互斥锁 多个进程间共享 第一个 ...

  6. c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...

  7. DLL入门浅析(5)——使用DLL在进程间共享数据

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/21/90734.html 在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的 ...

  8. C#使用互斥量(Mutex)实现多进程并发操作时进程间的同步操作(进程同步)

    本文主要是实现操作系统级别的进程同步的代码及测试结果,代码经过测试,可直接使用,也可供参考. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题]. 随着服务进 ...

  9. Node.js - 阿里Egg的多进程模型和进程间通讯

    前言 最近用Egg作为底层框架开发项目,好奇其多进程模型的管理实现,于是学习了解了一些东西,顺便记录下来.文章如有错误, 请轻喷 为什么需要多进程 伴随科技的发展, 现在的服务器基本上都是多核cpu的 ...

  10. python并发编程之多进程1-----------互斥锁与进程间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

随机推荐

  1. 给Hexo博客文章加密

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 原文地址 这是个啥 首先, 这是 Hexo 生态圈中 最好的 ...

  2. [转帖]深入JVM - Code Cache内存池

    深入JVM - Code Cache内存池 1. 本文内容 本文简要介绍JVM的 Code Cache(本地代码缓存池). 2. Code Cache 简要介绍 简单来说,JVM会将字节码编译为本地机 ...

  3. [转帖]linux 内核协议栈 TCP time_wait 原理、配置、副作用

    https://my.oschina.net/u/4087916/blog/3051356   0. 手把手教你做中间件.高性能服务器.分布式存储技术交流群 手把手教你做中间件.高性能服务器.分布式存 ...

  4. [转帖] 请求量突增一下,系统有效QPS为何下降很多?

    https://www.cnblogs.com/codelogs/p/17056485.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 最近我观察到一 ...

  5. 关于sar的学习

    关于sar的学习 背景 公司一套基于某冷门Python架构的系统前几天出现异常卡顿. 当时安装的时候必须使用ubuntu系统. 所以当时默认安装的ubuntu1804, 本来想尝试使用一下sar查看卡 ...

  6. [转帖]Linux文本处理三剑客sed详解(正则匹配、命令示例)

    https://developer.aliyun.com/article/885609?spm=a2c6h.24874632.expert-profile.312.7c46cfe9h5DxWK 简介: ...

  7. Spring 应用合并之路(二):峰回路转,柳暗花明 | 京东云技术团队

    书接上文,前面在 Spring 应用合并之路(一):摸石头过河 介绍了几种不成功的经验,下面继续折腾- 四.仓库合并,独立容器 在经历了上面的尝试,在同事为啥不搞两个独立的容器提醒下,决定抛开 Spr ...

  8. Gorm日志设置

    Logger Gorm提供了一个默认的logger实现,默认情况下日志数据级别为warn,同时输出慢SQL: Default = New(log.New(os.Stdout, "\r\n&q ...

  9. 在cmd(命令行)或bat文件切换盘符

    bat文件 写一个自动更新git的bat文件,如果bat文件放在E盘,想要去到D盘的某个目录下执行命令,代码如下: SET ksf=D:\code\KSFramework @echo on d: cd ...

  10. 使用visio如何快速生成一个网格状图案,文档技巧!

    如何使用visio如何快速生成一个网格状图案 我的成果图: 操作步骤如下: 1.新建一个visio文件,选择"基本框图".点击创建. 2.从左侧形状窗口中基本形状中选中正方形拖动到 ...