python process
1 | 原文:<strong>https: / / www.cnblogs.com / LY - C / p / 9145729.html < / strong> |
进程:资源分配的基本单位,进程数量为cpu核数+1,os.cpu_count()。计算密集时,使用进程
守护进程随着主进程的最后一句代码结束而结束
使用process模块可以创建进程
1 2 3 4 5 | from multiprocessing import Process p = Process(target,args,name) target:表示调用对象,即子进程要执行的任务 args:表示调用对象的位置参数”元组“ name:进程的名字 |
方法
1 2 3 4 5 | p.start():启动一个子进程,系统决定什么时候调用p.run() p.run():立即运行子进程 p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁 p.is_alive():判断p进程是否还存在,如果p仍然运行,返回 True p.join([timeout]):异步变同步,让主进程等待子进程执行完毕(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 |
多进程启动
1 2 3 | #如果好多进程都要启动,代码太长可以写成这样 p_list = [p1,p2,p3,p4,p5] [i.start() for i in p_list] |
属性
1 2 3 | p.daemon:默认值为 False ,如果设为 True ,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为 True 后,p不能创建自己的新进程,必须在p.start()之前设置 p.name:进程的名称 p.pid:进程的pid |
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from multiprocessing import Process import time def func(name): print ( 'son 的名字是 %s ' % name) time.sleep( 5 ) print ( '这里是son' ) if __name__ = = '__main__' : p = Process(target = func,args = ( 'xxx' ,)) p.start() time.sleep( 2 ) p.join() # 代码执行到这里,主进程main会停止等待子进程执行完毕才继续 print ( '这里是father' ) |
锁机制
1 2 3 4 5 6 | from multiprocessing import Lock l = Lock() #创建一个锁 l.acquire() # 加锁 l.release() # 释放锁 |
信号机制
1 2 3 4 5 6 7 8 9 10 | from multiprocessing import Semaphore l = Semaphore(n) #创建锁,n是指初始化一把锁配几把钥匙,一个int型 l.acquire() #加锁,可以加n把锁 l.release() #释放锁 #信号量机制比锁机制多了一个计数器,这个计数器是用来记录当前剩余几把钥匙的。 #当计数器为0时,表示没有钥匙了,此时acquire()处于阻塞。 #对于计数器来说,每acquire一次,计数器内部就减1,release一次,计数器就加1 |
事件机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from multiprocessing import Event e = Event() #创建事件 e.wait() #判断is_set的bool值,如果bool为True,则非阻塞,bool值为False,则阻塞 e. set () #将is_set()设为True e.clear() # 将is_set()设为False e.is_set() # 标识 # 事件是通过is_set()的bool值,去标识e.wait() 的阻塞状态 # 当is_set()的bool值为False时,e.wait()是阻塞状态 # 当is_set()的bool值为True时,e.wait()是非阻塞状态 # 当使用set()时,是把is_set的bool变为True # 当使用clear()时,是把is_set的bool变为False |
队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #先进先出 from multiprocessing import Queue q = Queue([n]) #n为该队列最多元素的个数,省略不限制 q.get( [ block [ ,timeout ] ] ) #返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止。 #block用于控制阻塞行为,默认为True. 如果设置为False,将引发Queue.Empty异常#timeout是可选超时时间,用在阻塞模式中。如果在指定的时间间隔内没有项目可用,将引发Queue.Empty异常。 q.get_nowait( ) #同q.get(False)方法。 q.put(item [, block [,timeout ] ] ) #将item放入队列。如果队列已满,此方法将阻塞至有空间可用为止。 #block控制阻塞行为,默认为True。如果设置为False,将引发Queue.Empty异常#timeout指定在阻塞模式中等待可用空间的时间长短。超时后将引发Queue.Full异常。 q.qsize() #返回队列中目前项目的正确数量。 q.empty() #如果调用此方法时 q为空,返回True。 q.full() #如果队列已满,返回为True. |
进程间共享内存
1 2 3 4 | from multiprocessing import Manager m = Manager() num = m. dict ({键 : 值}) num = m. list ([ 1 , 2 , 3 ]) |
进程池
1 2 3 4 5 6 7 8 9 10 11 12 13 | from multiprocessing import Pool p = Pool( 5 ) #创建进程池,限定进程个数 p. apply (func,args = (,)) #同步执行线程,阻塞 p.apply_async(func,args = (,),callback = func2) #异步执行线程,非阻塞 #func函数返回的值,传给了callback后面接的函数,进一步执行 p. map (func, iter ) #异步执行,iter为可迭代对象 p.close() #不在向进程池中添加任务,同步不需要使用 p.join() #等待进程池执行完任务,同步不需要使用 |
初学linux,每学到一点东西就写一点,如有不对的地方,恳请包涵!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能