首页 > 系统相关 >Python中使用共享变量+信号量实现进程间的实时通信

Python中使用共享变量+信号量实现进程间的实时通信

时间:2024-10-29 20:09:26浏览次数:7  
标签:Python 信号量 int ctypes posix shared 共享 shm

【Python程序1中】
import ctypes
import posix_ipc
import multiprocessing
from multiprocessing import shared_memory

# 如果系统中已经存在名为 /semaphore1 的信号量对象,Python并不会重新初始化它,而是使用现有的信号量,
# 导致现有的信号量可能有残留状态,使得 acquire() 一直阻塞。
# 在创建信号量之前,先删除现有的同名信号量
try:
posix_ipc.unlink_semaphore("/semaphore1")
except posix_ipc.ExistentialError:
pass # 如果信号量不存在,忽略错误

# 创建具名信号量(其他进程可以使用同样的名称 "/semaphore1" 来访问),1表示有物品,0表示没物品
# 注意,需要intial_value = 1,这样信号量一开始才会有一个
# 使用 O_EXCL 标志来强制创建一个新的信号量
sem = posix_ipc.Semaphore("/semaphore1", flags=posix_ipc.O_CREAT | posix_ipc.O_EXCL, initial_value=1)
# 创建一个大小为 ctypes.c_int 所需的共享内存块
shm = shared_memory.SharedMemory(create=True, size=ctypes.sizeof(ctypes.c_int), name="steel")
# 使用 ctypes 将共享内存映射为一个整数
shared_int = ctypes.c_int.from_buffer(shm.buf)

sem.acquire()  # 获取信号量
###########需要执行的操作 ####################
if (out1 == True):
# 检测到有输入
shared_int.value = 1
else:
shared_int.value = 0
############ 需要执行的操作 #####################
sem.release()  # 释放信号量

# 释放共享内存
shm.close()
shm.unlink()

# 删除信号量(通常由创建信号量的进程负责清理)
sem.unlink()


【Python程序2中】
import posix_ipc
from multiprocessing import shared_memory, resource_tracker
import ctypes


# 链接信号量
sem = posix_ipc.Semaphore("/semaphore1")
# 连接到名为 "steel" 的共享内存块
shm = shared_memory.SharedMemory(name="steel")
# 使用 ctypes 将共享内存映射为一个整数
shared_int = ctypes.c_int.from_buffer(shm.buf)
# 取消资源跟踪,在另一个程序1中会释放这个共享内存
resource_tracker.unregister(shm._name, "shared_memory")

sem.acquire()  # 获取信号量
########## 待执行操作#################################
if shared_int.value ==1:
message = "True"
else:
message = "False"
########### 待执行操作###############################
sem.release()  # 释放信号量

标签:Python,信号量,int,ctypes,posix,shared,共享,shm
From: https://www.cnblogs.com/Daemon17/p/18514340

相关文章

  • [python]多线程快速入门
    前言线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。由于CPython的GIL限制,多线程实际为单线程,大多只用来处理IO密集型任务。Python一般用标准库threading来进行多线程编程。基本使用方式1,创建threading.Thread类的示例importthreadi......
  • python+flask框架的基于微信小程序的校园跑腿系统服务端视频8(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的快速发展,微信小程序作为一种轻量级的应用形式,已广泛应用于各类服务场景。在校园环境中,学生对于便捷生活服务的需求日......
  • python+flask框架的基于微信小程序的校园互助平台服务端视频8(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的飞速发展,微信小程序作为一种轻量级的应用形式,已经深入到人们生活的方方面面。在校园环境中,学生之间经常存在各种互助......
  • python+flask框架的基于微信小程序的校园跳蚤市场管理系统的设计与实现服务端视频8(开
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的快速发展,微信小程序作为一种轻量级的应用形式,在校园生活中的应用日益广泛。校园跳蚤市场作为学生二手物品交易的重要......
  • 【Python入门】7天速成Python桌面应用开发高手,WxPython vs PyQt:谁更胜一筹?
    ......
  • Python Web 前后端分离 后台管理系统 Django+vue(完整代码)
    1.前后端分离的架构在前后端分离的架构中,前端和后端分别作为独立的项目进行开发和部署。前端项目通过API与后端项目进行通信。前端:使用Vue.js构建用户界面,调用后端提供的RESTfulAPI获取和发送数据。后端:使用Django构建API,处理业务逻辑和数据存储2.创建django项目及vue项目......
  • python+flask框架的基于微信小程序的考勤出勤管理系统(开题+程序+论文) 计算机毕业设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景关于考勤出勤管理系统的研究,现有研究主要以传统企业考勤系统、高校教务管理系统中的考勤模块为主,这些系统多采用PC端或专用的考勤设备,虽然......
  • Python控制结构
    在编程的世界里,控制结构就像是一位指挥家,能够引导程序按顺序演奏出美妙的乐章。今天,我们将深入探讨Python中的条件判断和循环结构,当然,不会忘记用幽默的方式来让这些概念更易懂!条件判断条件判断是控制程序流的重要组成部分。我们常用的 if-elif-else 结构就像是生活中的选......
  • 基于Python星载气溶胶数据处理与反演分析
    Python作为一种强大且易于学习的编程语言,已广泛应用于数据科学和大气科学领域,Python凭借其强大的数据处理能力,可以高效处理海量的气溶胶数据。例如,通过Pandas库,研究人员可以进行高效的数据清洗、整理和分析;NumPy库则提供了强大的数值计算功能,能够快速进行各种数学和统计运算;Car......
  • Python小白学习教程从入门到入坑------第十八课 异常模块与包【下】(语法基础)
    一、内置全局变量__name__在Python中,有一些内置的全局变量和特殊变量,它们是由Python解释器预定义的,可以在代码的任何地方直接使用。这些变量通常用于提供关于当前解释器状态的信息,或者用于控制解释器的行为在Python中,__name__是一个内置的特殊变量,也被称为“魔法变量”或“......