资讯动态

线程和进程

发布时间:2026/10/15 4:07:31 来源:尧图企业网站定制
进程含义是操作系统进行资源分配的基本单位每打开一个程序至少就会有一个进程线程是CPU调度的基本单位每一个进程至少都会有一个线程这个线程就是我们所说的主线程一个进程默认有一个线程进程里面可以创建多个线程线程依附在进程里面没有进程就没有线程#导入模块 from threading import Thread import time def sing(name): print(f{name}唱歌) # 使程序进入睡眠状态睡眠一秒 time.sleep(1) print(唱完了) def dance(name): print(f{name}跳舞) time.sleep(1) print(跳完了) if __name__ __main__: #1.防止别人导入文件的时候执行main里面的方法 #2.防止windows系统递归创建子进程 t1 threading.Thread(targetsing,args (susu,)) t2 threading.Thread(targetdance,args (lele,)) #维护线程 t1.setDaemon(True) t2.setDaemon(True) #开启线程 t1.start() t2.start() #获取线程的名字 print(t1.getName()) print(t2.getName()) #更改线程的名字 t1.setName(线程1) t2.setName(线程2) #阻塞主线程等待子线程结束之后再运行必须放在start()之后 t1.join() t2.join() print(prefect)运行结果susu唱歌 lele跳舞 Thread-1 Thread-2 跳完了 唱完了 prefect线程之间执行是无序线程执行是根据CPU调度执行的from threading import Thread import time li [] def wdate(): for i in range(5): li.append(i) time.sleep(0.2) print(写入数据,li) def rdate(): time.sleep(0.2) print(读出数据,li) if __name__ __main__: wd threading.Thread(targetwdate) rd threading.Thread(targetrdate) wd.start() wd.join() rd.start()资源共享a 0 b 1000000 def add(): for i in range(b): #将a申请为全局变量因为a此时相当于一个变量 global a a 1 print(a) def add2(): for i in range(b): global a a 1 print(a) if __name__ __main__: a1 threading.Thread(targetadd) a2 threading.Thread(targetadd2) a1.start() a2.start()运行结果每一次run之后的结果都不一样。这是其中一次的结果因为他们的资源是共享的1000000 1612059线程同步主线程和创建的子线程之间各自执行完自己的代码直至结束方法1.线程等待a 0 b 1000000 def add(): for i in range(b): #将a申请为全局变量因为a此时相当于一个变量 global a a 1 print(a) def add2(): for i in range(b): global a a 1 print(a) if __name__ __main__: a1 threading.Thread(targetadd) a2 threading.Thread(targetadd2) a1.start() a1.join()#等待a1子线程结束之后才开始执行a2子线程 a2.start() a2.join()运行结果1000000 20000002.同步锁对共享数据进行锁定保证多个线程方位共享数据不会出现数据错误问题保证同一时刻只能有一个线程进行去操作from threading import Thread from threading import Lock import time a 0 b 1000000 #创建锁 lock Lock() def add(): #开启锁 lock.acquire() for i in range(b): #将a申请为全局变量因为a此时相当于一个变量 global a a 1 print(a) #释放锁 lock.release() def add2(): lock.acquire() for i in range(b): global a a 1 print(a) lock.release() if __name__ __main__: a1 threading.Thread(targetadd) a2 threading.Thread(targetadd2) a1.start() a2.start()运行结果同上总结互斥锁的作用保证同一时刻只有一个线程去操作共享数据保证共享数据不会出现错误问题上锁和释放锁必须成对出现否则容易造成死锁现象死锁一直等待对方释放锁的现象就是死锁会造成应用程序停止响应不能处理其他任务互斥锁的却点会影响代码的执行效率进程含义是操作系统进行资源分配和调度的基本单位是操作系统结构的基础一个正在运行的程序或者软件就是一个进程进程类里面可以创建多个线程多进程也可以完成多任务进程的状态1.就绪状态运行的条件都已经满足正在等待CPU执行2.执行状态CPU正在执行其功能3.等待阻塞状态等待某些条件满足如一个程序sleep此时就处于等待状态进程语法结构multiprocessing模块提供了Process类代表进程对象Process类参数target:执行的目标任务即子进程要执行的任务args:以元组的形式传参kwargs:以字典的形式传参方法start():开启子进程is alive():判断进程是否还活着存在返回True,死亡返回Falsejoin():主进程等待子进程执行结束常用的属性name:当前进程的别名默认Process-Npid:当前进程的进程编号#导入模块 from multiprocessing import Process import os def sing(): print(在唱歌) print(fsing的子进程编号{os.getpid}父进程编号{os.getppid()}) def dance(): print(在跳舞) print(fdance的子进程{os.getpid()},父进程编号{os.getppid()}) if __name__ __main__: p1 Process(targetsing,name 线程1) p2 Process(targetdance,name 线程2) p1.start() p2.start() #判断线程是否还活着 print(p1.is_alive()) print(p2.is_alive())进程之间的通信Queue(队列)q.put():放入数据q.get():取出数据q.empty():判断队列是否为空q.qsize():返回当前队列包含的消息数量q.full():判断队列是否满了#导入模块 from queue import Queue q Queue(3) q.put(我是谁) q.put(我在哪) q.put(我在干什么) #取出数据 print(q.get()) #判断是否为空 print(q.empty()) #返回数量 print(q.qsize()) #判断是否满了 print(q.full())运行结果我是谁 False 2 False#导入模块 from multiprocessing import Process,Queue li [zahnsan,lisi,wangwu,zhaoliu] def wdate(q1): for i in range(5): print(f{i}已经被放入) q1.put(i) print(写入数据,li) def rdate(q2): while True: if q2.empty(): break else: print(li) if __name__ __main__: q Queue() wd Process(targetwdate,args(q,)) rd Process(targetwdate,args(q,)) wd.start() rd.start()

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑