0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python多进程学习

马哥Linux运维 来源:马哥Linux运维 2023-04-26 11:04 次阅读

Python 多进程 (Multiprocessing) 是一种同时利用计算机多个处理器核心 (CPU cores) 进行并行处理的技术,它与 Python 的多线程 (Multithreading) 技术不同,因为多线程的并发任务依赖于一个 GIL (Global Interpreter Lock)。在多进程中,每个进程都有自己的解释器进程,并且可以同时使用多个 CPU 核心,因此在处理计算密集型任务时比多线程更有效。

要使用 Python 的多进程,我们需要使用内置的 multiprocessing 模块,该模块提供了创建和管理进程的类和函数,下面是一个简单的 Python 多进程的例子:

importmultiprocessing

defworker():
 """子进程的工作函数"""
 print("Starting worker")
 # 这里可以放一些耗时的任务
 print("Finished worker")

if__name__=='__main__':
 # 创建一个子进程
 p=multiprocessing.Process(target=worker)
 # 启动子进程
 p.start()
 # 等待子进程结束
 p.join()
 print("Parent process finished")

在这个例子中,我们定义了一个函数 worker(),这个函数是子进程要执行的任务,我们使用 multiprocessing.Process 类创建了一个子进程,并将 worker() 函数作为参数传递给 target 参数,然后我们使用 start() 方法启动子进程,join() 方法等待子进程完成,最后,主进程会输出一条消息,表示自己已经完成了。

除了创建单个子进程,我们还可以使用 Pool 类来创建多个子进程,以便并行处理多个任务,下面是一个使用 Pool 类的例子:

importmultiprocessing

defworker(num):
 """子进程的工作函数"""
 print(f"Starting worker {num}")
 # 这里可以放一些耗时的任务
 print(f"Finished worker {num}")

if__name__=='__main__':
 # 创建一个包含 4 个进程的进程池
 withmultiprocessing.Pool(processes=4)aspool:
   # 使用 map 函数并行执行 worker 函数
   pool.map(worker, [1,2,3,4])
 print("Parent process finished")

在这个例子中,我们使用 Pool 类创建了一个包含 4 个进程的进程池,然后我们使用 map() 方法并行执行 worker() 函数。map() 方法会将参数列表中的每个参数依次传递给 worker() 函数,并将返回值收集到一个列表中。最后,主进程会输出一条消息,表示自己已经完成了。

当我们需要执行一些计算密集型的任务时,使用 Python 的多进程技术可以显著提高程序的执行效率,下面是一些使用 Python 的多进程技术的常见场景:

数据处理:当我们需要处理大量的数据时,可以使用多进程技术将数据分成多个部分,并同时处理它们。

网络爬虫:当我们需要爬取大量的网页时,可以使用多进程技术将不同的任务分配给不同的进程,从而并行地执行它们。

图像处理:当我们需要对大量的图像进行处理时,可以使用多进程技术并行执行不同的处理任务。

在使用 Python 的多进程技术时,我们需要注意一些问题:

进程间通信:由于每个进程都有自己的内存空间,因此它们之间不能直接共享数据,我们需要使用 multiprocessing 模块提供的管道、队列等机制来实现进程间通信。

进程池:在使用 Pool 类时,我们需要注意控制并发任务的数量,以免占用过多的系统资源。

内存限制:由于每个进程都有自己的内存空间,因此如果同时创建太多的进程,会占用过多的系统内存,导致程序崩溃。

下面是一个使用进程池并行执行任务的例子,其中使用了 imap_unordered() 方法来异步执行任务:

importmultiprocessing
importtime

defsquare(x):
 """计算平方"""
 time.sleep(1) # 模拟耗时的计算
 returnx*x

if__name__=='__main__':
 # 创建进程池
 withmultiprocessing.Pool()aspool:
   # 异步执行任务
   forresultinpool.imap_unordered(square,range(10)):
     print(result)

在这个例子中,我们创建了一个包含默认进程数的进程池,然后使用 imap_unordered() 方法并行执行 square() 函数。imap_unordered() 方法会返回一个迭代器,每次迭代都会返回一个已经完成的任务的结果。由于我们使用了异步执行,因此任务的返回顺序不一定与参数的顺序相同。

除了使用 imap_unordered() 方法,我们还可以使用 imap() 方法,它会按照参数的顺序返回任务的结果,此外,我们还可以使用 apply() 和 apply_async() 方法来执行单个任务或异步执行单个任务。

总的来说,使用 Python 的多进程技术可以帮助我们更有效地处理计算密集型任务,通过使用 multiprocessing 模块和 Pool 类,我们可以轻松地创建和管理多个子进程,并使它们并行地执行任务。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18298

    浏览量

    222257
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10451

    浏览量

    206583
  • 函数
    +关注

    关注

    3

    文章

    3904

    浏览量

    61311
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476
  • 多进程
    +关注

    关注

    0

    文章

    12

    浏览量

    2588

原文标题:Python多进程学习

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    跪求LabVIEW多进程问题,谢谢各位

    进行处理。但是这样就不是多线程并行了,相当于几个站点是顺序执行的,就像读取数据时候就是先读第一个站点的数据放进第一个队列,再读第二个站点的数据放进第二个队列......这样,我想这样点多了会死机的吧,或是来不及读取串口或者TCP中数据这样的。 请大家帮忙看看。能不能给提供一个多进程并行的思路?谢谢了
    发表于 04-04 16:34

    多进程不同能对同一个对象进行赋值问题”如何解决?

    进程的并行性决定了多进程不同能对同一个对象进行赋值,这个问题如何解决?代码如下////启动清屏//always @(negedge clk) begin //en脉冲到来且时钟下降沿时,启动输出初始化 if(en) begindisoff
    发表于 04-28 09:26

    实验:编写多进程程序

    1.实验目的 通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤。 2.实验内容 该实验有3个进程
    发表于 09-05 15:32

    labview有多进程吗?

    labview有多进程吗?
    发表于 02-03 17:13

    多线程和多进程的区别

    6.你的数据库一会又500个连接数,一会有10个,你分析一下情况7.udp和tcp的区别8.多线程和多进程的区别9.有一台web服务器,你选择用多线程还是多进程,...
    发表于 07-19 07:21

    浅谈多进程多线程的选择

    鱼还是熊掌:浅谈多进程多线程的选择关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择
    发表于 08-24 07:38

    python多线程和多进程对比

    适合在对CPU计算运算要求较高的场景下使用,譬如大数据分析,机器学习多进程虽然总是最快的,但是不一定是最优的选择,因为它需要CPU资源支持下才能体现优势
    发表于 03-15 16:42

    进程控制开发之编写多进程程序实验解析

    7.4.1 编写多进程程序 1.实验目的 通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤。 2.
    发表于 10-18 16:33 0次下载
    <b class='flag-5'>进程</b>控制开发之编写<b class='flag-5'>多进程</b>程序实验解析

    python多线程与多进程的区别

    Python的设计哲学是“优雅”、“明确”、“简单”。因此,Perl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计
    发表于 12-01 09:04 5972次阅读
    <b class='flag-5'>python</b>多线程与<b class='flag-5'>多进程</b>的区别

    多进程与多线程的深度比较

    嵌入式Linux中文站,关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。这句话应付考试基本上够了,但如果在工作中遇到类似的选择
    发表于 04-02 14:42 371次阅读

    使用Python多进程的理由

    Python 是运行在解释器中的语言,查找资料知道, python 中有一个全局锁( GI),在使用多进程( Threa)的情况下,不能发挥多核的优势。而使用多进程( Multipro
    的头像 发表于 04-04 16:50 1362次阅读
    使用<b class='flag-5'>Python</b><b class='flag-5'>多进程</b>的理由

    关于Python多进程和多线程详解

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。
    的头像 发表于 11-06 14:46 307次阅读
    关于<b class='flag-5'>Python</b><b class='flag-5'>多进程</b>和多线程详解

    shell脚本实现并发多进程

    在Shell脚本中实现并发多进程可以使用以下方法: 使用符号来将其放入后台执行,从而实现并发多进程。例如: #!/bin/bash command1 command3 符号,它们将在后台并发执行
    的头像 发表于 11-08 10:20 473次阅读

    Linux系统上多线程和多进程的运行效率

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好
    的头像 发表于 11-10 10:54 436次阅读
    Linux系统上多线程和<b class='flag-5'>多进程</b>的运行效率

    你还是分不清多进程和多线程吗?一文搞懂!

    你还是分不清多进程和多线程吗?一文搞懂! 多进程和多线程是并发编程中常见的两个概念,它们都可以用于提高程序的性能和效率。但是它们的实现方式和使用场景略有不同。 1. 多进程多进程
    的头像 发表于 12-19 16:07 254次阅读