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

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

在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进程通信方式,选择合适的方式取决于具体的应用场景和需求。

相关文章
|
3天前
|
安全 Java Python
GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。
【6月更文挑战第20天】GIL是Python解释器的锁,确保单个进程中字节码执行的串行化,以保护内存管理,但限制了多线程并行性。线程池通过预创建线程池来管理资源,减少线程创建销毁开销,提高效率。示例展示了如何使用Python实现一个简单的线程池,用于执行多个耗时任务。
15 6
|
4天前
|
存储 缓存 运维
深入理解操作系统:从进程管理到内存分配
在数字时代的心脏,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的核心机制,包括进程管理、内存分配和文件系统,揭示它们如何协同工作以支持现代计算需求。通过技术深度解析和实际应用示例,我们将一窥操作系统的复杂性与优雅,理解其在软件开发和系统性能优化中的重要性。
|
24天前
|
消息中间件 Linux C语言
进程通信:管道与队列
进程通信:管道与队列
|
15天前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
26 1
|
18小时前
|
缓存 监控 安全
Linux top命令详解:持续监听进程运行状态
Linux top命令详解:持续监听进程运行状态
12 3
|
5天前
|
Linux 数据处理
深入了解Linux命令kill:终止进程的艺术
**Linux的`kill`命令详解:高效管理进程的工具** `kill`命令在Linux中用于向进程发送信号,如SIGTERM(默认)和SIGKILL,以终止或影响进程行为。它通过进程ID(PID)操作,支持多种信号和选项,如`-l`列出信号,`-9`强制杀进程。例如,`kill 1234`发送TERM信号,`kill -9 1234`发送KILL信号。使用时注意,SIGKILL是不可忽视的,可能导致数据丢失。配合`pgrep`和`pkill`能更灵活管理进程。了解进程依赖和使用其他命令如`ps`和`top`可优化系统资源管理。
|
8天前
|
Linux Shell 调度
Linux进程——Linux下常见的进程状态
Linux进程——Linux下常见的进程状态
18 4
|
8天前
|
Linux Shell 编译器
Linux进程——Linux环境变量
Linux进程——Linux环境变量
11 3
|
8天前
|
Linux Shell C语言
Linux进程控制——Linux进程程序替换
Linux进程控制——Linux进程程序替换
14 2

相关实验场景

更多