找回密码
 会员注册
查看: 33|回复: 0

Python学习篇]Python进程和线程

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
72027
发表于 2024-9-7 13:57:24 | 显示全部楼层 |阅读模式
线程Python多线程编程是一种在单个程序中同时执行多个线程的技术,主要用于提高程序的并发性和性能,尤其是在I/O操作频繁的场景下。Python提供了threading模块来支持多线程编程。基本概念线程:线程是一个独立的执行流,可以与其他线程并发运行。主线程:每个Python程序都有一个默认的主线程,程序从主线程开始运行。守护线程:守护线程在主线程结束时会自动退出,不会阻止程序终止。Thread类用于创建和管理线程。创建一个线程语法:threading.Thread(target,args=(),kwargs={},daemon=None)target:线程执行的目标函数。args:传递给目标函数的参数(元组)。kwargs:传递给目标函数的关键字参数(字典)。daemon:设置为守护线程(布尔值)。name:设置线程名称。示例:importthreadingdefprint_numbers(max_num):print(f"线程名称:{threading.current_thread().name}")foriinrange(1,max_num):print(i)defprint_letters():print(f"线程名称:{threading.current_thread().name}")forletterin'ABCDE':print(letter)#创建线程#thread1=threading.Thread(target=print_numbers,args=(6,))thread1=threading.Thread(target=print_numbers,kwargs={'max_num':6})thread2=threading.Thread(target=print_letters)#启动线程thread1.start()thread2.start()#修改线程名称#thread2.name="CustomThread2"#等待所有线程完成thread1.join()thread2.join()print("所有线程执行完成")start():启动线程并调用run()方法。run():线程执行的代码,可以重写。join(timeout=None):阻塞主线程,直到调用join的线程结束或超时。线程之间是共享全局变量的importthreadinglist1=[]defadd_data():foriinrange(3):list1.append(i)print(f"添加数据:{i}")defread_data():print(f"获取数据:{list1}")thread1=threading.Thread(target=add_data)thread2=threading.Thread(target=read_data)thread1.start()thread2.start()线程互斥 Lock线程共享数据会造成数据安全性问题。使用互斥锁解决。Lock类:用于线程同步,防止多个线程同时访问共享资源。lock常用函数:acquire(blocking=True,timeout=-1):请求锁(加锁)。release():释放锁。importthreading#多个线程对全局变量进行自增g_num=0#创建一把互斥锁lock=threading.Lock()deftask():globalg_num#对修改共享变量的代码进行加锁lock.acquire()#加锁foriinrange(1000000):g_num+=1print(f"task{g_num},线程名称-{threading.current_thread().name}")#共享变量操作完成后释放锁lock.release()#释放锁thread1=threading.Thread(target=task)thread2=threading.Thread(target=task)thread1.start()#thread1.join()thread2.start()进程一个正在运行的程序就是一个进程,它是资源分配和执行的基本单位,每个进程有自己独立的内存空间、系统资源和执行线程。注意:一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。python对进程的操作在Python中,可以使用multiprocessing模块来创建和管理进程。multiprocessing模块允许你在多个处理器上运行任务,从而提高程序的性能。Process类用于创建和管理进程。创建一个进程语法:multiprocessing.Process(target,args,kwargs,name,daemon)target:进程执行的目标函数。args:传递给目标函数的参数(元组)。kwargs:传递给目标函数的关键字参数(字典)。daemon:设置为守护进程(布尔值)。name:设置进程名称。multiprocessing.Process的常用方法start():启动进程并执行target函数。join(timeout=None):等待进程终止,可选超时时间。is_alive():返回进程是否正在运行。terminate():立即终止进程。示例:importmultiprocessingdefdepartment(num,name):print(f'员工{num},Name:{name}')if__name__=='__main__':p=multiprocessing.Process(target=department,args=(5,),kwargs={'name':'IT部门'})p.start()示例:获取进程名称和进程IDimportmultiprocessingimportosimporttimedefdepartment(num,name):print(f'员工{num},Name:{name}')print(f"获取进程名称:{multiprocessing.current_process().name}")print(f"获取当前进程ID:{os.getpid()}")print(f"获取父进程ID:{os.getppid()}")whileTrue:time.sleep(30)if__name__=='__main__':p=multiprocessing.Process(target=department,args=(5,),kwargs={'name':'IT部门'})p.start()print(f"获取Main进程名称:{multiprocessing.current_process().name}")print(f"获取Main进程ID:{os.getpid()}")print(f"获取Main父进程ID:{os.getppid()}")示例:杀死进程importmultiprocessingimportosimporttimedefdepartment(num,name):print(f'员工{num},Name:{name}')process_pid=os.getpid()print(f"获取当前进程ID:{process_pid}")#杀死进程,类似linux中的kill-9pidos.kill(process_pid,9)whileTrue:time.sleep(30)if__name__=='__main__':p=multiprocessing.Process(target=department,args=(5,),kwargs={'name':'IT部门'})p.start()注意:进程之间不共享全局变量。主进程会等待所有的子进程执行结束后再结束。进程内的异常无法通过try-except捕获到,需要使用multiprocessing.Process的Process对象的join()方法来获取异常进程之间共享数据multiprocessing.Queue()importmultiprocessing#生产者defproducer(queue):foriinrange(5):queue.put(i)#消费者defconsumer(queue):whileTrue:item=queue.get()ifitemisNone:#消费者退出循环条件breakprint(f"Gotitem:{item}")if__name__=='__main__':queue=multiprocessing.Queue()p1=multiprocessing.Process(target=producer,args=(queue,))p2=multiprocessing.Process(target=consumer,args=(queue,))p1.start()p2.start()p1.join()queue.put(None)#设置消费者退出循环条件p2.join()进程互斥Lockimportmultiprocessingimporttime#多个进程调用这个函数,对共享变量数据进行操作defworker(lock,shared_value):for_inrange(10):#获取锁,with上下文写法,会自动释放锁资源withlock:#临界区开始-锁开始temp=shared_value.valuetime.sleep(0.1)#模拟一些计算或操作shared_value.value=temp+1#临界区结束-锁结束if__name__=="__main__":#创建一把锁lock=multiprocessing.Lock()#共享的整数变量,初始值为0shared_value=multiprocessing.Value('i',0)processes=[]#创建多个进程for_inrange(5):p=multiprocessing.Process(target=worker,args=(lock,shared_value))processes.append(p)p.start()#等待所有进程完成forpinprocesses:p.join()print(f"最终的shared_counter值:{shared_value.value}")
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 22:58 , Processed in 0.462120 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表