本文共 2631 字,大约阅读时间需要 8 分钟。
在 Python 中,进程间通信(IPC)是开发多任务程序的核心技能之一。通过管道、队列和信号等方式,进程可以在不同进程间高效地交换数据。本文将详细介绍这些方法,并提供实用的代码示例。
管道是一种简单而强大的进程通信方式,适用于父子进程间的数据传输。它通过文件描述符实现单向通信。
import osdef child(fd): os.close(fd[0]) # 读端关闭 print("Child process: Ready to write") for i in range(5): data = f"{i}\n" os.write(fd[1], data.encode())def parent(): r, w = os.pipe() pid = os.fork() if pid == 0: child(w) os._exit(0) else: os.close(w) print("Parent process: Reading data") buf = os.read(r, 1024) for line in buf.decode().split('\n'): if not line: break print(line)parent() os.pipe():创建一个管道,返回两个文件描述符(读端 r 和写端 w)。os.fork():创建子进程。父进程继续执行,子进程运行 child 函数。child 函数:在写端写入数据,子进程结束后退出。parent 函数:关闭写端,读取数据并输出结果。队列是一种更安全且灵活的进程通信方式,适用于多个进程间的数据传输。multiprocessing 库提供了 Queue 类,支持多种操作,如 put() 和 get()。
from multiprocessing import Process, Queuedef producer(q): for i in range(5): q.put((i, 'A')) print(f"Producer put data: {i}A")def consumer(q): while True: try: data = q.get(True, 1) # 阻塞获取,超时1秒 print(f"Consumer got data: {data}") except queue.Empty: print("No more data") breakif __name__ == '__main__': q = Queue() p1 = Process(target=producer, args=(q,)) p2 = Process(target=consumer, args=(q,)) p1.start() p2.start() p1.join() p2.join() Queue 类:提供了安全的进程间通信,防止死锁和数据丢失。producer 函数:向队列中放入元组 (i, 'A'),表示第 i 个任务。consumer 函数:从队列中获取数据,直到队列为空。在 Unix 系统中,信号是一种轻量级的进程间通信方式。通过 signal 模块,可以向特定进程发送信号并处理。
import osimport signaldef handler(signum, frame): print(f"Received signal: {signum}")if __name__ == '__main__': pid = os.fork() if pid > 0: signal.signal(signal.SIGINT, handler) os.kill(pid, signal.SIGUSR1) # 向子进程发送 SIGUSR1 信号 while True: pass # 保持主进程运行 else: signal.pause() # 等待信号 os.kill(pid, signal.SIGUSR1):向子进程发送 SIGUSR1 信号。signal.signal():设置信号处理函数。signal.pause():在信号等待时暂停当前进程。在自然语言处理任务中,多进程并行处理可以显著提高效率。以下示例使用 multiprocessing.Pool 创建一个包含 4 个进程的进程池,用于并行处理文本数据。
from multiprocessing import Pooldef process_text(data): print(f"Processing: {data}")if __name__ == '__main__': with Pool(processes=4) as p: p.map(process_text, ['text1', 'text2', 'text3', 'text4']) Pool 类:创建一个包含指定进程数的进程池。p.map():将任务列表分配给各个进程并行执行。通过以上方法,可以在 Python 中实现进程间的高效通信。选择合适的方式取决于具体需求:如果需要简单的单向通信,使用管道;如果需要安全且灵活的通信,使用队列;如果需要处理系统信号,使用信号模块。在实际开发中,可以根据任务复杂度选择最合适的方式。
转载地址:http://ttlfk.baihongyu.com/