多进程、多线程
1.multiprocessing是Python中多进程的模块,使用它能实现多线程代码编写
2.启动子线程并结束子线程
先定义一个创建线程的方法,再在主方法中调用Process()函数创建子线程
以及父线程,再调用start()方法以及join()函数实现进程的启动
def run_proc(name): print('Run child process %s(%s)' %(name,os.getpid())) if __name__ =='__main__': print('Parent process %s.' %os.getpid()) p = Process(target = run_proc,args = ('test',)) print('Child process will start.') p.start() p.join() print('Child process end.')
3.创建线程池,先创建定义子线程的方法,再在主方法中通过Pool函数配合自己电脑的CPU处理器个数,
再利用Pool函数的实例apply.async方法创建线程池
from multiprocessing import Pool import os,time,random #random为随机函数 #该方法用于子线程内容的实现 def long_time_task(name): print('Run task %s(%s)...'% (name,os.getpid())) start = time.time() time.sleep(random.random()*3) end = time.time() #显示开始和结束时间 print('Task %s runs %0.2f seconds' %(name,(start-end))) if __name__ == '__main__': print('Parent process %s.' %os.getpid()) p = Pool(8) #表示线程量 for i in range(9): #这个函数类似于创建线程池 p.apply_async(long_time_task,args=(i,)) print('Waiting for all subprocesses done...') p.close() p.join() print('ALL subprocesses done.')
4.线程间的通信通过Queue、Pipes方法来实现
先创建写方法,像里面传入数据,通过put方法传入,再定义读方法,从Queue中读取数据通过get方法
再通过Process方法创建两个读写变量,调用start方法和join方法最后调用terminate方法终止死循环
from multiprocessing import Process,Queue import os,time,random #写数据进程执行的代码: def write(q): print('Process to write :%s'% os.getpid()) for value in ['A','B','C']: print('put %s to queue' %value) q.put(value) time.sleep(random.random()) #读数据执行的代码 def read(q): print('Process to read:%s' % os.getpid()) while True: value = q.get(True) print('Get %s from queue.'% value) if __name__ == '__main__': #父进程创建Queue,并传给各个子进程 q = Queue() pw = Process(target = write,args = (q,)) pr = Process(target = read,args = (q,)) #启动子进程pw,写入: pw.start() #启动子线程,读取: pr.start() #等待pw结束: pw.join() #pr进程是死循环,无法等待其结束,只能强行终止: pr.terminate()
5.启动线程就是把一个函数传入并创建一个实例,我们通过threading模块中的threading.Thread方法来创建线程实例
threading。current_thread().name方法获得当前线程
def loop():#定义方法来创建一个线程通过循环获得信息 print('thread %s is running...'% threading.current_thread().name) n = 0 while n<5 n = n+1 print('thread %s >>>%s'%(threading.current_thread.name,n)) time.sleep(1)#通过time.sleep()函数休眠一会儿输出 print('threading %s ended.' %threading.current_thread().name) print('thread %s is running...'% threading.current_thread().name) # 通过threading Thread()函数传入创建线程方法名以及线程名创建实例线程 t = threading.Thread(target = loop,name = 'LoopThread') t.start() t.join() print('thread %s ended.'%threading.current_thread().name)
6.由于线程之间的运行是交替的,所以需要通过Lock来规范线程的运行
先要声明一个锁变量,再获取锁,最后通过try-finally语句释放锁,再调用锁实例来启动线程和关闭线程
7.多核CPU
在Python中任意线程在执行前,都会先获得一个GIL锁,没执行100行代码,就会释放资源,让其他的线程执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!