python自动化--语言基础线程、生产者消费者示例

进程与线程的区别
进程不共享空间,线程共享地址空间

线程共享空间优缺点:
优点:多线程给用户的体验好些,打开时占用的内存比进程少
缺点:共享地址空间会相互干扰,甚至有影响

 1 import threading
 2 import time
 3 
 4 class Mythreading(threading.Thread):
 5     def __init__(self,threadID,name,counter):
 6         threading.Thread.__init__(self)    #固定格式
 7         self.threadID = threadID
 8         self.name = name
 9         self.counter = counter
10         print("初始化完成")
11     def run(self):                         #由cpu来处理决定线程间的执行顺序
12         print("开始"+self.name)
13         print_time(self.name,self.counter,5)
14         print("结束"+self.name)
15 
16 def print_time(threasName,counter,delay):
17     while counter:
18         time.sleep(delay)
19         print("%s:%s"%(threasName,time.ctime(time.time())))
20         counter -= 1
21 
22 #创建线程
23 thread1 = Mythreading(1,"thread1",1)
24 thread2 = Mythreading(2,"thread2",2)
25 
26 #开启线程
27 thread1.start()
28 thread2.start()
 1 import threading
 2 import time
 3 
 4 class Mythreading(threading.Thread):
 5     def __init__(self,threadID,name,counter):
 6         threading.Thread.__init__(self)    #固定格式
 7         self.threadID = threadID
 8         self.name = name
 9         self.counter = counter
10         print("初始化完成")
11     def run(self):                         #由cpu来处理决定线程间的执行顺序
12         threadLock.acquire()               #获得锁,成功获得锁定后返回True,可选的参数timeout不填时将一直阻塞直到获得锁定
13         print_time(self.name,self.counter,3)
14         threadLock.release()               #释放锁,开始下一个线程
15 
16 def print_time(threasName,counter,delay):
17     while counter:
18         time.sleep(delay)
19         print("%s:%s"%(threasName,time.ctime(time.time())))
20         counter -= 1
21 
22 threadLock = threading.Lock()
23 threads = []
24 
25 #创建线程
26 thread1 = Mythreading(1,"thread1",1)
27 thread2 = Mythreading(2,"thread2",2)
28 
29 #开启线程
30 thread1.start()
31 thread2.start()
32 
33 # thread1.join()
34 # thread2.join()
35 threads.append(thread1)
36 threads.append(thread2)
37 for t in threads:
38     t.join()       #后边的代码必须等待,等线程运行完成才会往后运行代码
39 
40 print("我的的花儿也谢了")

为什么下图左为串行,下图右为并行运行呢?

图左love启动后分别执行start和join,启动了join后边代码就需要等待前边代码运行完成。总共18s

图右同时启动love和hate,运行所需要执行的时间然后停止。总共10s

 超级播放器示例,如下:

 1 import threading
 2 from time import sleep, ctime
 3 def music(func):
 4     for i in range(2):
 5         print ("I was listening to %s! %s" %(func,ctime()))
 6         sleep(4)
 7 def move(func):
 8     for i in range(2):
 9         print ("I was at the %s! %s" %(func,ctime()))
10         sleep(5)
11 
12 def player(name):
13     r = name.split('.')[1]
14     if r=="mp3":
15         music(name)
16     elif r=="mp4":
17         move(name)
18     else:
19         print("%s is error!"%name)
20 
21 lists = ["love.mp3","hate.mp4","cuicui.mp3","nnnn.mp4"]
22 
23 threads = []
24 files = range(len(lists))
25 for i in files:
26     t = threading.Thread(target=player,args=(lists[i],))
27     threads.append(t)
28 
29 if __name__ == '__main__':
30     for i in files:
31         threads[i].start()
32     for i in files:
33         threads[i].join()
34     print ('all end: %s' %ctime())

生产者与消费者示例:

 1 import threading
 2 class Produce(threading.Thread):
 3 
 4     def __init__(self,name):
 5         threading.Thread.__init__(self)
 6         self.name = name
 7     def run(self):
 8         global x
 9         tt.acquire()
10         if x > 0 :
11 
12             print("我不生产了")
13         else:
14             for i in range(5):
15                 x += 1
16                 print("%s在生产中,第%d个"%(self.name,x))
17         tt.release()
18 
19 class Consume(threading.Thread):
20     def __init__(self,name):
21         threading.Thread.__init__(self)
22         self.name = name
23     def run(self):
24         global x
25         tt.acquire()
26         if x == 0:
27 
28             print("我不消费了")
29         else:
30             for i in range(5):
31                 x -= 1
32                 print("%s在消费中,第%d个"%(self.name,x+1))
33         tt.release()
34 x = 0
35 tt = threading.Lock()
36 # tt = threading.Condition
37 
38 p = Produce("produce")
39 c = Consume("consume")
40 
41 p.start()
42 c.start()
43 
44 p.join()
45 c.join()
原文地址:https://www.cnblogs.com/hanxiaobei/p/6565610.html