线程之线程的创建,同一进程中线程是数据共享的,解决线程数据安全的办法,进程与线程运行效率的对比,死锁,递归锁,信号量,线程的守护进程

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#线程的两种创建方式
import time
from threading import Thread
def func(i):
    time.sleep(0.1)
    print(i)
class myThread(Thread):
    def __init__(self,n):
        super().__init__()
        self.n=n
    def run(self):
        print('n>>>',self.n)
 
 
if __name__ == '__main__':
    t=Thread(target=func,args=(1,))
    t.start()
    t2=myThread('傻子')
    t2.start()
    t.join()
    print('主线程结束')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#同一进程下各个线程资源共享
import time
from threading import Thread
from multiprocessing import Process
 
num = 100
def func():
    global num
    num = 0
 
if __name__ == '__main__':
    t = Thread(target=func,)
    t.start()
    t.join()
    print(num)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#解决共享数据不安全问题
import time
from threading import Thread,Lock
haha=100
def func(lock):
    global haha
    with lock:#加锁
        num=haha
        num-=1
        haha=num
        time.sleep(0.00001)
if __name__ == '__main__':
    lock=Lock()#同步锁,互斥锁
    lst=[]
    for i in range(10):
        t=Thread(target=func,args=(lock,))#定义线程
        t.start()#开启线程
        lst.append(t)
    [tt.join() for tt in lst]#主线程等子线程完成
    print('haha:',haha)
    print('主进程结束。。。')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#进程与线程运行效率对比
 
import time
from threading import Thread
from multiprocessing import Process
 
def func(n):
    num = 0
    for n1 in range(n):
        num += n1
    print('num',num)
if __name__ == '__main__':
    t_s_t = time.time()
    t_list = []
    for i in range(10):
        t = Thread(target=func,args=(10,))
        t.start() #速度非常快
        t_list.append(t)
    [tt.join() for tt in t_list]
    t_e_t = time.time()
    t_dif_t = t_e_t - t_s_t  #获取了线程的执行时间
 
    p_s_t = time.time() #开始时间
    p_list = []
    for ii in range(10):
        p = Process(target=func,args=(10,))
        p.start()
        p_list.append(p)
    [pp.join() for pp in p_list]
    p_e_t = time.time() #结束时间
    p_dif_t = p_e_t - p_s_t #时间差
 
    print('线程>>>>',t_dif_t)
    print('进程....',p_dif_t)
    print('主线程结束')#死锁
import time
from threading import Thread,Lock
def func1(lockA,lockB):
    lockA.acquire()
    print('得到A锁')
    lockB.acquire()
    print('这是func1')
    time.sleep(0.01)
    lockB.release()
    lockA.release()
def func2(lockA,lockB):
    lockB.acquire()
    print('得到B锁')
    lockA.acquire()
    print('这是func2')
    time.sleep(0.01)
    lockA.release()
    lockB.release()
def haha(lockA,lockB):
    func1(lockA,lockB)
    func2(lockA,lockB)
if __name__=="__main__":
    lockA=Lock()
    lockB=Lock()
    t1=Thread(target=haha,args=(lockA,lockB))
    t1.start()
    t2=Thread(target=haha,args=(lockA,lockB))
    t2.start()
    t1.join()
    t2.join()
    print('主线程结束')

  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#递归锁,解决线程死锁问题
import time
from threading import Thread,RLock
def func1(lockA,lockB):
    lockA.acquire()
    print('得到A锁')
    lockB.acquire()
    print('这是func1')
    time.sleep(0.01)
    lockB.release()
    lockA.release()
def func2(lockA,lockB):
    lockB.acquire()
    print('得到B锁')
    lockA.acquire()
    print('这是func2')
    time.sleep(0.01)
    lockA.release()
    lockB.release()
def haha(lockA,lockB):
    func1(lockA,lockB)
    func2(lockA,lockB)
if __name__=="__main__":
    lockA=lockB=RLock()
    t1=Thread(target=haha,args=(lockA,lockB))
    t1.start()
    t2=Thread(target=haha,args=(lockA,lockB))
    t2.start()
    t1.join()
    t2.join()
    print('主线程结束')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#信号量
import time
from threading import Thread,Semaphore
def func(semaphore,i):
    semaphore.acquire()
    print(i)
    time.sleep(2)
    semaphore.release()
if __name__=='__main__':
    semaphore=Semaphore(4)
    t_list=[]
    for i in range(10):
        t=Thread(target=func,args=(semaphore,i))
        t.start()
        t_list.append(t)
    [tt.join() for tt in t_list]
    print('主线程结束')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#线程的守护
##守护线程会跟随主线程代码的结束而结束,但是主线程不会结束,主线程会等非守护子线程结束后才结束
import time
from threading import Thread
 
def func1(n):
    time.sleep(2)
    print(n)
def func2(n):
    time.sleep(1)
    print(n)
if __name__ == '__main__':
    t1=Thread(target=func1,args=('我是子线程1',))
    t1.daemon=True
    t1.start()
    t2=Thread(target=func2,args=('我是子线程2',))
    t2.start()
    print('主线程结束')

  

posted @   冒蓝火的加特林哒哒哒  阅读(145)  评论(0编辑  收藏  举报
编辑推荐:
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
阅读排行:
· 编程神器Trae:当我用上后,才知道自己的创造力被低估了多少
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· Ai满嘴顺口溜,想考研?浪费我几个小时
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
点击右上角即可分享
微信分享提示