php sem acquire,PHP | 关于php中sem_get failed for key no space left on device问题的解决方案...

有时我们在处理并发操作时会使用信号量做进程同步,如下一个php应用的例子

$sem_id = sem_get($id,1,0666,true);

sem_acquire($sem_id);

...

sem_release($sem_id);

我们release了资源,但是系统没有真正的释放资源 通过 [root@localhost ~]# ipcs -s

------ Semaphore Arrays -------- key semid owner perms nsems 0x0002152f 32769 www 666 3 0x00019fff 65538 www 666 3 0x00019ff1 98307 www 666 3 ....

我们知道 ,Semaphores 会很快达到上限

#ipcs -l

max semaphores per array = 250

系统默认是250个,于是当我们再次通过sem_get()获取资源句柄时就会得到以下错误: Warning: sem_get() [function.sem-get]: failed for key 0x(n): No space left on device in ...

最后修改程序,加入 sem_remove($sem_id);

新的问题出现了 sem_release() [function.sem-release]: failed to release key 0xxxxxxx: Invalid argument in...

这是由于出现竞争,假设a进程等待b进程,b完成时执行了sem_remove,所以a进程执行sem_release就会出错,因为信号里已经被释放了,故提示信号量无效.

所以php下的信号量不适用于需要创建大量不同锁的环境. 折衷的方法就是将锁hash到一个范围:

如: $sem_id = sem_get($id % 100,1,0666,true); ...

另外记得信号量上限的配置,这里是调整到2048 sysctl -w kernel.sem="1024 32000 100 2048" echo "kernel.sem=1024 32000 100 2048" >> /etc/sysctl.conf

最后想提一个非常重要的问题,当sem_get第4个参数auto_release为true时,php的信号里的作用范围只限当前区间,如:

function lock() { $sem_id = sem_get($id,1,0666,true); sem_acquire($sem_id); ... }

lock (); //函数中调用了信号量,作用域只在函数内 lock(); // 再次调用不会死锁,因为第一个信号量锁定作用已消失

移除: for whatever in `ipcs -s | awk '{print $2}'`; do echo $whatever; done

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 250. 统计同值子树(递归)

文章目录1. 题目2. 解题1. 题目 给定一个二叉树,统计该二叉树数值相同的子树个数。 同值子树是指该子树的所有节点都拥有相同的数值。 示例: 输入: root [5,1,5,5,5,null,5]5/ \1 5/ \ \5 5 5 输出: 4来源:力扣(LeetC…

开启MySQL远程访问权限 允许远程连接

1、登陆mysql数据库 mysql -u root -p 查看user表 mysql> use mysql;Database changedmysql> select host,user,password from user;---------------------------------------------------------------| host | user | password …

php 函数报错,PHP报错函数error_reporting()怎么用?

PHP中,报错函数error_reporting()用于规定应该报告何种PHP错误,语法“error_reporting(level)”;使用该函数可以设置在脚本运行时的错误级别,如果没有设置可选参数level,则仅返回当前的错误报告级别。推荐:…

LeetCode 426. 将二叉搜索树转化为排序的双向链表(BST中序循环遍历)

文章目录1. 题目2. 解题1. 题目 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 …

ASP.NET中Request.IsAuthenticated和Request.User.Identity.IsAuthenticated的区别

Reflector 查看 System.Web.dll 中 HttpRequest.cs 的代码: public bool IsAuthenticated {get{return (((this._context.User ! null) && (this._context.User.Identity ! null)) && this._context.User.Identity.IsAuthenticated);} }所以说这两者…

LeetCode 285. 二叉搜索树中的顺序后继(中序遍历)

文章目录1. 题目2. 解题1. 题目 给你一个二叉搜索树和其中的某一个结点,请你找出该结点在树中顺序后继的节点。 结点 p 的后继是值比 p.val 大的结点中键值最小的结点。 示例 1: 输入: root [2,1,3], p 1 输出: 2 解析: 这里 1 的顺序后继是 2。 请注意 p 和…

matlab 更改jdk版本,程序员怎么修改微信号

2020.6.5,注定是个不平凡的日子,因为微信可以改微信号了。那么,作为一个程序员,我们需要怎么修改微信号才能携带程序员气息。。。修改条件满足以下条件即可一年内没有修改过微信号安卓客户端,且版本大于7.0.15之后则点…

LeetCode 510. 二叉搜索树中的中序后继 II(查找右子树或者祖父节点)

文章目录1. 题目2. 解题1. 题目 给定一棵二叉搜索树和其中的一个节点 node ,找到该节点在树中的中序后继。 如果节点没有中序后继,请返回 null 。 一个结点 node 的中序后继是键值比 node.val大所有的结点中键值最小的那个。 你可以直接访问结点&…

mysql set类型 查询,MYSQL SET字段类型怎么查询

昨天自己在写一个dedecms功能时突然用到了解dedecms中flag字段,但里面用的是set类型,开始直接查询where xx 可查出单字符,但是多个是就不好查了,下面我来总结一下set字段查询方法吧。SET可以包含最多64个成员,其值为一…

一个关于Remoting的简单例子

前言 今天在整理以前写的一些demo,看到一个关于remoting的例子。好久不用remoting了,果断记录一下。 什么是Remoting 简单回顾下: 1.Remoting是一种远程通信,或者说跨应用程序(域)通信的技术,在C/S架构的程…

php mqtt qos,Mqtt Qos 深度解读

1.QoS含义 :Quality of Service,服务质量2.作用域发布者的Qos订阅者的Qos3.等级与作用level 0:最多一次的传输level 1:至少一次的传输,(鸡肋)level 2: 只有一次的传输4.交互过程qos0对于qos1而言,对于clien…

LeetCode 1502. 判断能否形成等差数列

文章目录1. 题目2. 解题1. 题目 给你一个数字数组 arr 。 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。 …

关键字搜索.sql

if exists (select * from dbo.sysobjects where id object_id(N[dbo].[f_search]) and xtype in (NFN, NIF, NTF))drop function [dbo].[f_search]GO if exists (select * from dbo.sysobjects where id object_id(N[序数表]) and OBJECTPROPERTY(id, NIsUserTable) 1)drop…

matlab2017调用vgg19,VGG19模型训练+读取

VGG-19的介绍和训练这里不做说明,网上资源很多,而且相对比较简单.本博文主要介绍VGG-19模型调用官方已经训练好的模型,进行测试使用.[TOC]VGG-19模型简单介绍VGG模型使用VGG结构模型VGG具体参数模型VGG-19模型文件介绍这里是重难点,VGG-19模型存储的方式有点复杂可以通过作者文…

LeetCode 1504. 统计全 1 子矩形(记录左侧的连续1的个数)

文章目录1. 题目2. 解题1. 题目 给你一个只包含 0 和 1 的 rows * columns 矩阵 mat , 请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1: 输入:mat [[1,0,1],[1,1,0],[1,1,0]] 输出:13 解释: 有 6 个 1x1 的矩…

iverilog命令选项解释

随着数字系统设计规模的增大,verilog文件几乎都会分成几个文件模块来管理,就如一个大工程一样,并且相互之间都会有调用关系,典型的就是,有一个文件要调用其他的文件实例,但是本身却不被任何模块所调用&…

matlab中ode23s使用方法,MATLAB中ode23函数,龙格库塔函数

今天说一说MATLAB中ode23函数的原理,在网上看了好多,但是不知道是怎么计算的,就知道是那么用的,但是最后结果咋回事不知道,今天来讲一讲是怎么计算的。首先来个程序:function feg6fun(t,y)f-y^3-2;end上面是…

勘误和声明

背景: 昨天在博客园浏览别人的文章《C# 不要自动四舍五入!》(地址:http://www.cnblogs.com/eweb/archive/2012/05/18/2507468.html)时,发现了自己之前的文章《C#,double和decimal数据类型以截断的方式保留指…

LeetCode 1503. 所有蚂蚁掉下来前的最后一刻(脑筋急转弯)

文章目录1. 题目2. 解题1. 题目 有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。 当两只向 不同 方向移动的蚂蚁在某个点相遇时&a…

matlab多元线性回归bint,MATLAB中多元线性回归的例子课件

《MATLAB中多元线性回归的例子课件》由会员分享,可在线阅读,更多相关《MATLAB中多元线性回归的例子课件(12页珍藏版)》请在人人文库网上搜索。1、MATLAB中多元线性回归的例子,2.线性回归,bregress(y,X) b,bint,r,rint,sregress(y,X,alpha),输入: y因变量…