猪行天下之Python基础——9.3 Python多线程与多进程(下)(一)

简介: 内容简述:1、multiprocess模块详解

1、multiprocess模块详解


Python的os模块封装了常见的系统调用,其中就包含 「fork函数」,通过这个函数可以轻松的创建子进程,但是要注意一点,在Windows系统上是无法使用fork函数的,Python为我们提供了可跨平台的multiprocess模块。该模块提供了一个Process类来代表一个进程对象,用法和Thread非常相似。


① Process进程对象


创建一个进程的代码示例如下:


from multiprocessing import Process
import os
def show_msg(name):
    print("子进程运行中:name = %s , pid = %d " % (name, os.getpid()))
if __name__ == '__main__':
    print("父进程 %d" % os.getpid())
    p = Process(target=show_msg, args=('测试',))
    print("开始执行子进程~")
    p.start()
    p.join()
    print("子进程执行完毕!")


运行结果如下


父进程 26539
开始执行子进程~
子进程运行中:name = 测试 , pid = 26540 
子进程执行完毕!


Process构造函数


Process(group=None, target=None, name=None, args=(), kwargs={})


参数详解


  • group:分组,很少用到


  • target:调用对象,传入任务执行函数作为参数


  • name:进程别名


  • args:给调用对象以元组的形式提供参数,比如有两个参数args=(a,b),如果只有一个参数,要这样写args=(a,),不能把逗号漏掉,不然会被当做括号运算符使用!


  • kwargs:调用对象的关键字参数字典


Process的常用函数


  • is_alive():判断进程实例是否还在执行;


  • join([timeout]):是否等待进程实例执行结束,或等待多少秒;


  • start():启动进程实例(创建子进程);


  • run():如果没有给定target参数,对这个对象调用start()方法时,
    就将执行对象中的run()方法;


  • terminate():不管任务是否完成,立即终止;


除了使用fork函数和上述操作创建进程的方式外,还可以自定义一个Process类,重写__init__run函数即可,代码示例如下:


from multiprocessing import Process
import os
class MyProcess(Process):
    def __init__(self, name):
        Process.__init__(self)
        self.msg = name
    def run(self):
        print("子进程运行中:name = %s , pid = %d " % (self.msg, os.getpid()))
if __name__ == '__main__':
    print("父进程 %d" % os.getpid())
    p = MyProcess('测试')
    print("开始执行子进程~")
    p.start()
    p.join()
    print("子进程执行完毕!")


运行结果如下


父进程 26794
开始执行子进程~
子进程运行中:name = 测试 , pid = 26795 
子进程执行完毕!


② Pool进程池


知道了如何创建进程,那么实现多进程有不是什么难事了,一个循环创建多个即可,但是有个问题,进程可是重量级别的程序,重复进程创建和销毁会造成一定的性能开销! Python为我们提供了一个进程池对象Pool用来缓解进程重复关启带来的性能消耗问题。在创建进程池的时候指定一个容量,如果接收到一个新任务,而池没满的话,会创建一个新的进程来执行这个任务,如果池满的话,任务则会进入等待状态,直到池中有进程结束,才会创建新的进程来执行这个任务。


Pool的构造函数


Pool(processes=None, initializer=None, initargs=(),maxtasksperchild=None, context=None)


一般只用到第一个参数,processes用于设置进程池的容量,即最多并发的进程数量,如果不写默认使用os.cpu_count()返回的值。


Pool常用函数详解


  • apply(func, args=(), kwds={}):使用堵塞方式调用func,堵塞的意思是一个进程结束,释放回进程池,下一个进程才可以开始,args为传递给func的参数列表,kwds为传递给func的关键字参数列表,该方法在Python 2.3后就不建议使用了。


  • apply_async(func, args=(), kwds={}, callback=None,error_callback=None) :使用非阻塞方式调用func,进程池进程最大数可以同时执行,还支持返回结果后进行回调。


  • close():关闭进程池,使其不再接受新的任务;


  • terminate():结束工作进程,不再处理未处理的任务,不管任务是否完成,立即终止;


  • join():主进程阻塞,等待⼦进程的退出,必须在close或terminate之后使用;


  • map(func, iterable, chunksize=None):这里的map函数和Python内置的高阶函数map类似,只是这里的map方法是在进程池多进程并发进行的,接收一个函数和可迭代对象,把函数作用到每个元素,得到一个新的list返回。


最简单的进程池代码示例如下


import multiprocessing as mp
import time
def func(msg):
    time.sleep(1)
    print(mp.current_process().name + " : " + msg)
if __name__ == '__main__':
    pool = mp.Pool()
    for i in range(20):
        msg = "Do Something %d" % (i)
        pool.apply_async(func, (msg,))
    pool.close()
    pool.join()
    print("子进程执行任务完毕!")


相关文章
|
5天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
10天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
7天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
17 1
|
12天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
27 2
|
14天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
17天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
37 4
|
17天前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
41 1
|
4月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
72 3
|
24天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
1月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
30 3

热门文章

最新文章