多进程在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. [转帖]修改Linux内核参数,减少TCP连接中的TIME-WAIT

    https://www.cnblogs.com/xiaoleiel/p/8340346.html 一台服务器CPU和内存资源额定有限的情况下,如何提高服务器的性能是作为系统运维的重要工作.要提高Lin ...

  2. [转帖]事务上的等待事件 —— enq: TX - contention

    TX锁是保护事务的,事务结束时便会释放.因此,为获得TX锁为等待的会话,要等到拥有锁的会话的事务结束为止. SQL> select name,parameter1,parameter2,para ...

  3. [转帖]GC Ergonomics间接引发的锁等待超时问题排查分析

    https://www.cnblogs.com/micrari/p/8831834.html 1. 问题背景 上周线上某模块出现锁等待超时,如下图所示:我虽然不是该模块负责人,但出于好奇,也一起帮忙排 ...

  4. [转帖]PyCharm无法安装第三方模块,一直提示 updating list:time out 解决办法

    Pycharm无法安装第三方模块解决办法: 1.打开pycharm的项目的venv文件夹 2.打开文件夹目录中的pyvenv文件 3.将文件中的include-system-site-packages ...

  5. [转帖]java -d 参数(系统属性) 和 环境变量

    https://www.cnblogs.com/limeiyang/p/16565920.html 1. -d 参数说明 通过 java -h 查看可知: 注意:-D= : set a system ...

  6. [转帖]Linux后门的几种姿势

      转载自 https://evilanne.github.io/2017/08/26/Linux后门-持续关注/ 在一次渗透中,成功获取某目标几台比较重要的机器,当时只想着获取脱库,结果动静太大被发 ...

  7. 通过浪潮服务器序列号查询硬件配置以及CPU的价格

    最近想知道具体CPU的配置和价格. 发现可以使用如此方式进行查询 https://www.intel.cn/content/www/cn/zh/products/details/processors/ ...

  8. Systemd设置ulimit的方式与方法

    Systemd设置ulimit的方式与方法 摘要 Linux安装完成之后前面几件事情一般是处理selinux 以及处理ulimit 其实处理文件打开数有多种方法,之前也总结过, 但是最近因为syste ...

  9. python入门之后须掌握的知识点(excel文件处理+邮件发送+实战:批量化发工资条)【二】

    相关文章: python处理Excel实现自动化办公教学(含实战)[一] python处理Excel实现自动化办公教学(含实战)[二] python处理Excel实现自动化办公教学(数据筛选.公式操作 ...

  10. 4.1 C/C++ 使用结构与指针

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...