python线程

创建线程(两种方式)
创建线程方式一:

 1 from threading import Thread
 2 def f1(n):
 3     print('%s号线程任务'%n)
 4 
 5 def f2(n):
 6     print('%s号线程任务'%n)
 7 
 8 if __name__ == '__main__':
 9     t1 = Thread(target=f1,args=(1,))
10     t2 = Thread(target=f2,args=(2,))
11     t1.start()
12     t2.start()
13     print('主线程')
14 结果
15 1号线程任务
16 2号线程任务
17 主线程

创建线程方式二:

 1 class MyThread(Thread):
 2     def __init__(self,name):
 3         super().__init__()
 4         self.name = name
 5 
 6     def run(self):
 7         print('%s号子线程'%self.name)
 8 
 9 if __name__ == '__main__':
10     t = MyThread('1')
11     t.start()
12     print('主线程结束')
13 结果
14 1号子线程
15 主线程结束

查看线程PID

 1 from threading import Thread
 2 import os
 3 
 4 def f1(n):
 5     print('%s号线程任务'%n)
 6     print('1号线程PID',os.getpid())
 7 
 8 def f2(n):
 9     print('%s号子线程任务'%n)
10     print('2号线程PID',os.getpid())
11 
12 if __name__ == '__main__':
13     t1 = Thread(target=f1,args=(1,))
14     t2 = Thread(target=f2,args=(2,))
15     t1.start()
16     t2.start()
17     print('主线程')
18     print('主线程PID',os.getpid())

验证线程之间是数据共享的

 1 from threading import Thread
 2 
 3 #通过对全局变量的修改来验证线程之间是数据共享的,共享同一进程中的数据
 4 num = 111
 5 def f1(n):
 6     global num
 7     num = 222
 8     print('子线程num',num)
 9 
10 if __name__ == '__main__':
11     t = Thread(target=f1,args=(1,))
12     t.start()
13     # 等待子线程运行结束才继续往下执行
14     t.join()
15     print('主线程num',num)
16 结果
17 子线程num 222
18 主线程num 222

多进程与多线程效率对比

 1 import time
 2 from threading import Thread
 3 from multiprocessing import Process
 4 def f1():
 5     # time.sleep(1)   #io密集型
 6 
 7     #计算型
 8     n  = 0
 9     for i in range(10000000):
10         n += i
11 
12 if __name__ == '__main__':
13 
14     # 查看一下5个线程执行5个任务的执行时间(一个线程一个任务)
15     t_s_time = time.time()
16     t_list = []
17     for i in range(5):
18         t = Thread(target=f1,)
19         t.start()
20         t_list.append(t)
21     t_e_time = time.time()
22     t_dif_time = t_e_time - t_s_time
23 
24     # 查看一下5个进程执行同样的任务的执行时间(一个进程一个任务)
25     p_s_time = time.time()
26     p_list = []
27     for i in range(5):
28         p = Process(target=f1,)
29         p.start()
30         p_list.append(p)
31     [pp.join() for pp in p_list]
32     p_e_time = time.time()
33     p_dif_time = p_e_time - p_s_time
34     print('多线程的执行时间',t_dif_time)
35     print('多进程的执行时间',p_dif_time)

 1 import time
 2 from threading import Lock,Thread
 3 
 4 num = 111
 5 def f1(loc):
 6     loc.acquire()
 7     global num
 8     num -= 1
 9     time.sleep(0.001)
10     loc.release()
11 
12 if __name__ == '__main__':
13     t_loc = Lock()
14     t_list = []
15     for i in range(10):
16         t = Thread(target=f1,args=(t_loc,))
17         t.start()
18         t_list.append(t)
19     [tt.join() for tt in t_list]
20     print('主线程的num',num)
21 结果
22 主线程的num 101

死锁现象及递归锁解决方案(锁嵌套锁)

 1 import time
 2 from threading import Thread,Lock,RLock
 3 def f1(locA,locB):
 4     locA.acquire()
 5     print('f1抢到了A锁')
 6     time.sleep(1)
 7     locB.acquire()
 8     print('f1抢到了B锁')
 9     locB.release()
10     locA.release()
11 
12 def f2(locA,locB):
13     locB.acquire()
14     print('f2抢到了B锁')
15     locA.acquire()
16     time.sleep(1)
17     print('f2抢到了A锁')
18     locA.release()
19     locB.release()
20 
21 if __name__ == '__main__':
22     locA = Lock()
23     locB = Lock()
24 
25     #递归锁,维护一个计数器,acquire一次就加1,release就减1(为了解决死锁问题)
26     #locA = locB = RLock()
27     t1 = Thread(target=f1,args=(locA,locB))
28     t2 = Thread(target=f2,args=(locA,locB))
29     t1.start()
30     t2.start()
31 死锁结果
32 f1抢到了A锁
33 f2抢到了B锁
34 ... 程序不会结束,一直等待
35 
36 递归锁结果
37 f1抢到了A锁
38 f1抢到了B锁
39 f2抢到了B锁
40 f2抢到了A锁

多线程与多进程守护程序的区别

 1 from threading import Thread
 2 from multiprocessing import Process
 3 
 4 def f1():
 5     time.sleep(2)
 6     print('1号线程')
 7 
 8 def f2():
 9     time.sleep(3)
10     print('2号线程')
11 
12 if __name__ == '__main__':
13     # 守护线程:守护线程会等待所有非守护线程运行结束才结束
14     # t1 = Thread(target=f1,)
15     # t2 = Thread(target=f2,)
16     # t1.daemon = True
17     # t2.daemon = True
18     # t1.start()
19     # t2.start()
20     # print('主线程结束')
21 
22     # 守护进程: 主进程代码执行运行结束, 守护进程随之结束
23     # t1 = Process(target=f1,)
24     # t2 = Process(target=f2,)
25     # t1.daemon = True
26     # t2.daemon = True
27     # t1.start()
28     # t2.start()
29     # print('主进程结束')
30 多线程守护程序结果
31 1号线程
32 2号线程
33 主线程结束
34 
35 多进程守护程序结果
36 主进程结束

子进程不能input

 1 from threading import Thread
 2 from multiprocessing import Process
 3 
 4 def f1():
 5     name = input('<<<:')
 6     print(name)
 7 if __name__ == '__main__':
 8     input('主进程输入:')
 9     p = Process(target=f1,)
10     p.start()
11     print('主进程结束')
12 
13 # p = Thread(target=f1,)
14 # p.start()
15 # print('主进程结束')
16 
17 子进程如果input报错
18 EOFError: EOF when reading a line
19 
20 线程不需要main
21 <<<:主进程结束

线程事件(方法同进程一样)

 1 import time
 2 from threading import Thread,Semaphore,Event
 3 def f1():
 4     sm.acquire()
 5     print('哈哈哈')
 6     time.sleep(1)
 7     sm.release()
 8 if __name__ == '__main__':
 9     sm = Semaphore(5)
10     for i in range(2):
11         t = Thread(target=f1,)
12         t.start()
13 
14 e = Event()
15 print(e.is_set())
16 print('开始等待')
17 e.set()
18 # e.clear()
19 e.wait()    #当e对象的状态为False的时候会在这个地方阻塞,改为true之后就直接往下执
20 print(e.is_set())
21 print('结束等待')

 

posted @ 2019-01-13 18:37  LinuxCBB  阅读(290)  评论(0)    收藏  举报