进程通信 , 信号量 , 队列 , 管道 , 共享内存

简介: 进程通信 , 信号量 , 队列 , 管道 , 共享内存

在Python中信号量也是一种锁 , 能够一次给多个线程/进程加锁 ,设置同时访问的数量. 可以通过线程 (threading)和进程(multiprocessing)来调用 , 调用方法为threading.Semaphore/multiprocessing.Semaphore -- 这里的信号量是一种类 , 和互斥锁一样需要通过实例化调用 .

1. Threading模块中的信号量

 
import threading
 
# 创建信号量,参数表示初始的信号量计数值
semaphore = threading.Semaphore(3)  # 限制同时访问资源的线程数量为3
 
def worker():
    with semaphore:
        # 访问共享资源的代码
        print(threading.current_thread().name, "acquired the semaphore")
        # ...
 
# 创建多个线程
threads = []
for i in range(5):
    thread = threading.Thread(target=worker)
    threads.append(thread)
 
# 启动线程
for thread in threads:
    thread.start()
 
# 等待所有线程结束
for thread in threads:
    thread.join()

在上述例子中,threading.Semaphore(3)创建了一个初始计数值为3的信号量。with semaphore语句用于获取信号量,当进入这个语句块时,信号量的计数值会减少;离开时,计数值会增加。如果信号量的计数值为0,那么其他线程必须等待。

2. Multiprocessing模块中的信号量

import multiprocessing
# 创建信号量,参数表示初始的信号量计数值
semaphore = multiprocessing.Semaphore(3)  # 限制同时访问资源的进程数量为3
def worker():
    with semaphore:
        # 访问共享资源的代码
        print(multiprocessing.current_process().name, "acquired the semaphore")
        # ...
# 创建多个进程
processes = []
for i in range(5):
    process = multiprocessing.Process(target=worker)
    processes.append(process)
# 启动进程
for process in processes:
    process.start()
# 等待所有进程结束
for process in processes:
    process.join()

这个例子与线程的示例类似,但使用了multiprocessing.Semaphore。信号量在多进程环境中同样可以用于控制对共享资源的访问。同样,进入with semaphore语句块时,信号量计数值减少,离开时增加。

无论是在多线程还是多进程的场景中,信号量都是一种有效的工具,用于避免竞争条件和控制并发访问共享资源。

二. 进程通信

在Python中,进程通信是指在多进程编程中,不同的进程之间进行信息交流和共享数据的机制。由于每个进程有自己独立的内存空间,因此进程之间的通信需要通过特定的机制来实现。以下是一些Python中常用的进程通信方式:

1. 队列(Queue):

  • multiprocessing.Queue 提供了一个简单的队列,允许多个进程通过放置和获取消息来进行通信。队列是线程安全的,可以用于在多进程之间安全地传递数据。
from multiprocessing import Process, Queue
def worker(queue):
    data = queue.get()
    # 进行处理
    print(data)
if __name__ == "__main__":
    my_queue = Queue()
    process = Process(target=worker, args=(my_queue,))
    process.start()
    my_queue.put("Hello from the main process")
    process.join()

在Python中,queue.get() 是用于从队列中获取数据的方法。这通常用于在多线程或多进程的环境中进行线程间或进程间的安全数据传递。

multiprocessing 模块或 queue 模块中,get() 方法是一个阻塞调用,意味着如果队列中没有可用的数据,调用 get() 的线程或进程将会等待,直到有数据可供获取。一旦有数据可用,get() 会返回队列中的下一个元素,并将其从队列中移除。

2. 管道(Pipe):

  • multiprocessing.Pipe 提供了一种全双工的通信机制,允许两个进程之间进行双向通信。



from multiprocessing import Process, Pipe
def worker(conn):
    data = conn.recv()
    # 进行处理
    print(data)
    conn.send("Hello from the worker process")
if __name__ == "__main__":
    parent_conn, child_conn = Pipe()
    process = Process(target=worker, args=(child_conn,))
    process.start()
    parent_conn.send("Hello from the main process")
    response = parent_conn.recv()
    print(response)
    process.join()

3.共享内存(Value和Array):

  • multiprocessing.Valuemultiprocessing.Array 允许创建在多个进程之间共享的数值或数组。这些对象会被存储在共享内存中,因此可以被多个进程访问。
from multiprocessing import Process, Value
def worker(shared_value):
    # 进行处理
    shared_value.value += 1
    print(shared_value.value)
if __name__ == "__main__":
    counter = Value("i", 0)
    process = Process(target=worker, args=(counter,))
    process.start()
    process.join()

这些是一些常见的Python进程通信方式,选择合适的方式取决于具体的应用场景和需求。

相关文章
|
1月前
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
129 14
|
10天前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
78 48
|
3月前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
7天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
39 16
|
1月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
117 20
|
2月前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
2月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
3月前
|
算法 调度 开发者
深入理解操作系统:从进程管理到内存分配
本文旨在为读者提供一个深入浅出的操作系统知识之旅,从进程管理的基础概念出发,探索内存分配的策略与技巧。我们将通过实际代码示例,揭示操作系统背后的逻辑与奥秘,帮助读者构建起对操作系统工作原理的直观理解。文章不仅涵盖理论知识,还提供实践操作的指导,使读者能够将抽象的概念转化为具体的技能。无论你是初学者还是有一定基础的开发者,都能在这篇文章中找到有价值的信息和启发。
|
3月前
|
算法 调度 C++
深入理解操作系统:从进程管理到内存分配
【10月更文挑战第42天】本文将带你进入操作系统的神秘世界,探索其核心概念和关键技术。我们将从进程管理开始,了解操作系统如何协调和管理多个程序的运行;然后,我们将深入研究内存分配,看看操作系统如何有效地分配和管理计算机的内存资源。通过这篇文章,你将获得对操作系统工作原理的深入理解,并学会如何编写高效的代码来利用这些原理。
|
3月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?

热门文章

最新文章

相关实验场景

更多