博客
关于我
Python中的进程通信
阅读量:796 次
发布时间:2023-03-09

本文共 2631 字,大约阅读时间需要 8 分钟。

Python 进程通信:从基础到实践

在 Python 中,进程间通信(IPC)是开发多任务程序的核心技能之一。通过管道、队列和信号等方式,进程可以在不同进程间高效地交换数据。本文将详细介绍这些方法,并提供实用的代码示例。


1. 管道(Pipe)

管道是一种简单而强大的进程通信方式,适用于父子进程间的数据传输。它通过文件描述符实现单向通信。

代码示例

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 函数:关闭写端,读取数据并输出结果。

  • 2. 队列(Queue)

    队列是一种更安全且灵活的进程通信方式,适用于多个进程间的数据传输。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 函数:从队列中获取数据,直到队列为空。
  • 主程序:创建队列,启动两个进程(生产者和消费者),确保所有进程结束后继续运行。

  • 3. 信号(Signal)

    在 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():在信号等待时暂停当前进程。

  • 4. 人工智能大模型应用示例

    在自然语言处理任务中,多进程并行处理可以显著提高效率。以下示例使用 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/

    你可能感兴趣的文章
    Python中DrissionPage的详细解析与实战
    查看>>
    python中enumerate、变量类型转换
    查看>>
    python中execute是啥_python – 为什么“c.execute(…)”打破循环?
    查看>>
    python中exit和break区别_Python中exit()和sys.exit()之间的区别
    查看>>
    python中h5的用法
    查看>>
    python中http协议编程_HTTP编程
    查看>>
    python中import os_Python:相对导入与绝对导入(import)、os.path、__file__
    查看>>
    Python中set.discard和set.remove方法之间的运行时差异?
    查看>>
    python中yield的用法详解——最简单,最清晰的解释
    查看>>
    python中‘set.intersection()‘的算法是什么?
    查看>>
    Python中一个图形中的多个绘图
    查看>>
    python中一个好的持久同步队列
    查看>>
    Python中不准确的对数
    查看>>
    python中什么是实例方法_在Python中创建实例方法对象的不同方法
    查看>>
    Python中使用cutecharts实现简单的手绘风格的图表
    查看>>
    python中使用dxfgrabber,解析dxf文件信息生成obj文件
    查看>>
    Python中使用ncmbot玩转网易云音乐
    查看>>
    Python中使用PIL快速实现二值图
    查看>>
    Python中使用PIL快速实现灰度图
    查看>>
    Python中使用pip install ncmbot时各种错误解决办法
    查看>>