当前位置: 首页 > article >正文

Python中使用multiprocessing模块创建进程

        在计算机编程领域,多进程编程是一种常见的并发编程技术,特别适用于利用多核处理器来提高程序性能和并行处理任务。Python作为一种功能强大的编程语言,提供了多种方法来实现多进程编程。其中,multiprocessing模块为我们提供了一种简单而强大的方式来创建和管理进程。本文将深入介绍Python中使用multiprocessing模块创建进程的方法和技巧。

一、multiprocessing模块简介
        multiprocessing模块是Python标准库中的一个内置模块,主要用于实现多进程编程。它提供了创建进程、子进程管理、进程间通信等功能,使得我们可以轻松地编写并发程序。与Python的threading模块相比,multiprocessing模块更适合执行CPU密集型任务,因为它使用多个进程而不是多个线程,并充分利用了多核处理器的优势。

二、创建进程的方法
        使用multiprocessing模块创建进程非常简单。下面是一个基本的示例:

import multiprocessing

def worker():
    print("子进程执行")

if __name__ == '__main__':
    p = multiprocessing.Process(target=worker)
    p.start()
    p.join()
    print("主进程执行")

        在上述示例中,我们首先导入了multiprocessing模块,然后定义了一个名为worker的函数,用于在子进程中执行的任务。在`if __name__ == '__main__':`的条件下,我们创建了一个进程`p`,并将目标函数设为`worker`。最后,我们使用`p.start()`启动子进程,使用`p.join()`等待子进程执行完毕,然后打印出"主进程执行"。运行该程序,你将看到子进程和主进程交替执行的结果。

三、进程间通信
        在实际并发编程中,进程之间的通信是非常重要的。multiprocessing模块提供了多种方法来实现进程间的通信,包括队列、管道、共享内存等。

1. 队列
        队列是一种常见的进程间通信方式,它可以安全地传递数据,使得多个进程之间可以方便地共享信息。以下是使用队列实现进程间通信的示例:

import multiprocessing

def producer(queue):
    for i in range(5):
        queue.put(i)
        print("生产者生产:", i)

def consumer(queue):
    while True:
        item = queue.get()
        if item is None:
            break
        print("消费者消费:", item)

if __name__ == '__main__':
    queue = multiprocessing.Queue()
    p = multiprocessing.Process(target=producer, args=(queue,))
    c = multiprocessing.Process(target=consumer, args=(queue,))
    p.start()
    c.start()
    p.join()
    c.join()

        在上述示例中,我们首先创建了一个队列`queue`,然后定义了一个生产者函数`producer`,用于向队列中放入数据。接着,我们定义了一个消费者函数`consumer`,用于从队列中取出数据并进行处理。在主程序中,我们创建了一个生产者进程`p`和一个消费者进程`c`,并将队列`queue`作为参数传递给它们。最后,我们启动并等待这两个进程执行完毕。运行该程序,你将看到生产者不断向队列中放入数据,而消费者则不断从队列中取出并处理数据。

2. 管道
        管道是另一种常用的进程间通信方式,它提供了一个全双工的通信机制,使得两个进程可以互相发送和接收数据。以下是使用管道实现进程间通信的示例:

import multiprocessing

def sender(conn, messages):
    for message in messages:
        conn.send(message)
        print("发送消息:", message)
    conn.close()

def receiver(conn):
    while True:
        message = conn.recv()
        if message is None:
            break
        print("接收消息:", message)

if __name__ == '__main__':
    parent_conn, child_conn = multiprocessing.Pipe()
    messages = ['Hello', 'World', 'Bye']
    p = multiprocessing.Process(target=sender, args=(child_conn, messages,))
    c = multiprocessing.Process(target=receiver, args=(parent_conn,))
    p.start()
    c.start()
    p.join()
    c.join()

        在上述示例中,我们首先使用`multiprocessing.Pipe()`创建了一对管道`parent_conn`和`child_conn`。然后,我们定义了一个发送者函数`sender`,用于向管道发送消息。接着,我们定义了一个接收者函数`receiver`,用于从管道接收消息。在主程序中,我们创建了一个发送者进程`p`和一个接收者进程`c`,并将管道`child_conn`和`parent_conn`传递给它们。最后,我们启动并等待这两个进程执行完毕。运行该程序,你将看到发送者不断向管道发送消息,而接收者则不断接收并打印出消息。

四、进程池
        在实际并发编程中,我们常常需要创建多个进程来执行任务。然而,频繁地创建和销毁进程会带来较大的开销。为了减少这种开销,我们可以使用multiprocessing模块提供的进程池。以下是使用进程池实现并行任务执行的示例:

import multiprocessing

def worker(task):
    print("执行任务:", task)

if __name__ == '__main__':
    tasks = range(10)
    pool = multiprocessing.Pool()
    pool.map(worker, tasks)
    pool.close()
    pool.join()

        在上述示例中,我们首先定义了一个任务函数`worker`,用于执行具体的任务。在主程序中,我们创建了一个进程池`pool`,然后使用`pool.map()`方法将任务函数`worker`和任务列表`tasks`传递给进程池。进程池会自动分配任务给多个进程来执行,并返回结果。最后,我们使用`pool.close()`关闭进程池,并使用`pool.join()`等待所有进程执行完毕。运行该程序,你将看到任务并行执行的结果。

不知道人工智能如何学习?不知道单片机如何运作?不知道嵌入式究竟是何方神圣?搞不清楚什么是物联网?遇到问题无人可问?来我的绿泡泡交流群吧!里面有丰富的人工智能资料,帮助你自主学习人工智能相关内容,不论是基础的Python教程、OpenCV教程以及机器学习等,都可以在群中找到;单片机毕设项目、单片机从入门到高阶的详细解读、单片机的一系列资料也备好放入群中!关于嵌入式,我这里不仅仅有嵌入式相关书籍的电子版本,更是有丰富的嵌入式学习资料,100G stm32综合项目实战提升包,70G 全网最全嵌入式&物联网资料包,嵌入式面试、笔试的资料,物联网操作系统FreeRTOS课件源码!群内高手云集,各位大佬能够为您排忧解难,让您在学习的过程中如虎添翼!扫码进群即可拥有这一切!还在等什么?赶快拿起手机,加入群聊吧!二维码详情


http://www.kler.cn/news/234175.html

相关文章:

  • MYSQL笔记:约束条件
  • 算法||实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度
  • 最佳视频转换器软件:2024年视频格式转换的选择
  • React Emotion 如何优雅的使用样式(一)
  • 人物系统构建1
  • 使用raw.gitmirror.com替换raw.githubusercontent.com以解决brew upgrade python@3.12慢的问题
  • 问题:2、计算机网络的目标是实现________。 #媒体#知识分享
  • 第十六章 以编程方式使用 SQL 网关 - %SQLGatewayConnection 方法和属性
  • 知识图谱与图神经网络融合:构建智能应用的新前沿
  • [145] 二叉树的后序遍历 js
  • /etc/apt/sources.list 包含ubuntu18.04或bionic字样的解决思路
  • C语言字符常量与字符变量..
  • 前端修炼手册(uniapp的api篇)
  • Ansys方法基础
  • MacOS - M1芯片 Mac 在“恢复”模式中启用系统扩展教程
  • 更新win11后无法上网
  • Java继承和组合
  • 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏17(附项目源码)
  • 如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题
  • 如何从 iPhone 恢复已删除的视频:简单有效方法
  • 【漏洞复现】多语言药房管理系统MPMS文件上传漏洞
  • [论文总结] 深度学习在农业领域应用论文笔记12
  • LayUI中表格树折叠 --
  • Redis -- 安装客户端redis-plus-plus
  • 形态学算法之边界提取的简单python实现——图像处理
  • C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现
  • 1.5 Binance_interface API 币本位合约行情
  • Java基础知识总结(持续更新中)
  • 第一篇【传奇开心果微博文系列】Python微项目技术点案例示例:pillow库实现毛笔字春联
  • 华为数通方向HCIP-DataCom H12-821题库(单选题:461-480)