python基础 多线程threading join 守护线程setDeamon 递归锁Rlock

开篇大概介绍多线程与多进程区别,详细的理论区别自己可以在其它博客搜一下,这里不再赘述

同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作;cpu执行的都是线程,默认程序会开一个主线程;进程是程序以及和程序相关资源的集合;某些场景下我们可以使用多线程来达到提高程序执行效率的目的,下面就多线程的一些基础知识做简要说明

简单的多线程

 1 import threading, time
 2
 3 def test1(x):
 4     time.sleep(5)
 5     print(x**x)
 6
 7 #下面定义两个线程调用test1这个函数,创建多线程使用如下语法,target后面跟函数名,args传递实参,实参需要以元组形式传递
 8 start_time = time.time()
 9 t1 = threading.Thread(target=test1, args=(5,))
10 t2 = threading.Thread(target=test1, args=(6,))
11 #启动多线程
12 t1.start()
13 t2.start()
14 end_time = time.time()
15 total_time = end_time - start_time
16 print("two Thread used %s time"%total_time) #由于使用多线程,t1 t2启动以后并不会等待期执行完程序才继续往后走,因为主程序就是主线程和t1 t2是并行执行的,主程序执行到此t1 t2并未运行完成
17
18 time.sleep(6)
19 #多线程启动数量比较多时可以使用for循环,多线程并行执行,打印的结果有可能不是按照启动顺序来打印的
20 for i in range(5):
21     t3 = threading.Thread(target=test1, args=(i,))
22     t3.start()
23 time.sleep(6)

主线程等待非主线程执行完毕才继续执行   join方法

 1 #有些情况主线程需要子线程执行完毕后,有可能是将数据处理完毕后才执行接下来的主线程的东西
 2 start_time1 = time.time()
 3 tl = [] #将多线程的对象存起来,用于后面join方法
 4 for i in range(5):
 5     t4 = threading.Thread(target=test1, args=(i,))
 6     t4.start()
 7     tl.append(t4)
 8 for t in tl: #将多线程并发join,参加join的子线程执行完毕后才继续执行下面的主线程。
 9     t.join()
10 end_time1 = time.time()
11 total_time1 = end_time1 - start_time1
12 print(total_time1) #此次执行时间大约就是5s
 1 #如果多个子线程一些join一些没有join主线程怎么处理???部分子线程join主线程会等join时间最长的子线程结束后才继续,未参与join的子线程仍然和主线程并行运行
 2 t5 = threading.Thread(target=test1, args=(5,))
 3 t6 = threading.Thread(target=test1, args=(6,))
 4 t5.start()
 5 t6.start()
 6 t5_join_start_time = time.time()
 7 t5.join()
 8 time.sleep(10)
 9 t5_join_end_time = time.time()
10 print("t5 join time is %s"%(t5_join_end_time - t5_join_start_time)) #实际耗时15s

守护线程 setDeamon

 1 #守护进程,即主线程结束以后所有的其它线程也立即结束,不用等其它线程执行完毕;正常情况即使没加join主线程执行完毕当其它线程未执行完毕程序也不会退出,必须等待所有线程执行完毕程序才结束,类似主程序在末尾有默认的join
 2 def test1(x):
 3     time.sleep(5)
 4     print("i an other Thread",x**x)
 5
 6 for i in range(5):
 7     t = threading.Thread(target=test1, args=(i,))
 8     t.setDaemon(True)
 9     t.start()
10
11 print("Main Thread is done") #整个程序结束,不会等待守护线程打印操作执行完毕就直接结束了

递归锁 Rlock

 1 #递归锁,一个锁里面嵌套着锁,如果不使用递归锁会导致释放锁逻辑错误,整个程序就跑偏了;使用递归锁后程序会维护一个加锁 解锁的数据结构,保证释放锁不会出问题
 2 lock = threading.Lock()
 3 def test2():
 4     lock.acquire()
 5     print("this is test2")
 6     lock.release()
 7
 8 def test3():
 9     lock.acquire()
10     print("this is test3")
11     lock.release()
12
13 def test4():
14     lock.acquire()
15     test2()
16     print("this is test4")
17     test3()
18     lock.release()
19
20 rlock_test = threading.Thread(target=test4)
21 rlock_test.start()
22
23 while threading.active_count() != 1:
24     print("current thread count is",threading.active_count()) #整个程序一直在打印有两个线程,非主线程的锁嵌套出问题导致无法退出,整个程序卡死
25     time.sleep(1)

将lock = threading.Lock()修改为lock = threading.RLock()整个程序就能正常结束;正常结束的输出如下

this is test2this is test4current thread count is 2this is test3

原文地址:https://www.cnblogs.com/flags-blog/p/12443307.html

时间: 2024-10-12 07:45:58

python基础 多线程threading join 守护线程setDeamon 递归锁Rlock的相关文章

最简单的多线程并发与守护线程与join的运用

import threading import time def run(n): print("talk",n) time.sleep(3) #run("t1") #run("t2") t1=threading.Thread(target=run,args=("t1",)) t2=threading.Thread(target=run,args=("t2",)) #t1.start() #t2.start(

Python基础 - 多线程(上)

前面对 进程 一点认识, 通俗理解, 进程是操作系统(OS)进行资源调度分配的基本单元. 每个程序的至少就一个进程在OS中被"监控"着的哦. 然后围绕着多进程, 用消息队列共享全局变量, 守护主进程, 进程池...这一通探讨, 当然还是偏向应用的一方, 我自己偶尔工作有多任务的处理的地方, 也是优先弄多进程 (主要是公司电脑贼强, 我就要弄多进程, 就要浪费资源哈哈..). 进程 呢, 基本没用过, (爬虫除外, 之前有用 scrapy 是多线程的), 自己来手写应该是没有的. 为啥宁

python开发线程:线程&守护线程&全局解释器锁

一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.html?highlight=threading# 二 开启线程的两种方式 #方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print('%s

python基础---多线程

多线程 1 线程: 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位 多线程: 多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源 1. 多线程共享一个进程的地址空间 2. 线程比进

Python的多线程threading和多进程multiprocessing

python中的多线程就是在一个进程中存在着多个线程,在线程中,所有的线程都是共享资源的,线程之间的数据通信很简单.但是python仅支持一个线程的运行,因为python中存在一个全局解释器锁GIL(global interpreter lock),正是这个锁能保证同一时刻只有一个线程在运行,所以多线程依旧像是单线程的运行. GIL无疑就是一把对多线程有影响的全局锁,解决它对多线程的影响,不单单是释放GIL这么简单.GIL使得对象模型都是可以并发访问.GIL全局解释器锁解决多线程之间数据完整性和

Python学习之路:守护线程

守护线程:只起到守护主线程的作用,主线程退出守护线程也跟着退出. 1 import threading,time 2 3 def run(n): 4 print("task",n) 5 time.sleep(2) 6 print("task done",n) 7 8 start_time = time.time() 9 t_objs = [] 10 for i in range(50): 11 t = threading.Thread(target=run,args

从头认识多线程-1.17 守护线程setDaemon()

这一章节我们来讨论一下守护线程. 1.特性 守护线程是需要等待其他用户线程结束后才结束的线程,俗称保姆线程 2.源码解析 /** * Marks this thread as either a {@linkplain #isDaemon daemon} thread * or a user thread. The Java Virtual Machine exits when the only * threads running are all daemon threads. * * <p>

多线程06.thread守护线程

package chapter2; public class Demo02 { public static void main(String[] args) { Thread th1=new Thread(){ @Override public void run() { //主线程 Thread th2=new Thread(){ //守护线程 @Override public void run() { try { Thread.sleep(1_000); System.out.println(

线程_递归锁

#死锁:锁只能抢一次,释放后被其他人抢 from threading import Thread,Lock,current_thread import time class MyThread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print("%s 抢到A锁" %current_thread().getName()) mutexB.acquire() print("