进程:一段程序的执行过程 是最小的资源单位
线程:微进程,是最小的执行单元
一个程序至少有一个进程,一个进程至少有一个线程(主线程)
多线程的简单实现:
1 import threading
2 import time
3 def play():
4 print('star play game %s'%time.ctime())
5 time.sleep(3)
6 print('end play game %s' % time.ctime())
7
8 def read():
9 print('star read book %s' % time.ctime())
10 time.sleep(5)
11 print('end read book %s' % time.ctime())
12
13
14 if __name__=='__main__':
15 t1=threading.Thread(target=play)
16 t1.start()
17
18 t2=threading.Thread(target=read)
19 t2.setDaemon(True) #守护线程 与主线程同步结束 主线程只会考虑t1是否执行完成
20 t2.start()
21
22 # t2.join()#必须等他执行完才可以执行
23
24 print('the end...')
用Event 来处理线程同步下某个线程优先被执行 其他线程处于等待之下:
1 import threading
2 import time
3 class MyThread(threading.Thread):
4 def run(self):
5 pass
6 class Boss(threading.Thread):
7 def run(self):
8 print('现在开始加班哈')
9 event.set()
10 time.sleep(5)
11 print('ok,现在可以下班了哈')
12 event.set()
13
14 class Worker(threading.Thread):
15 def run(self):
16 event.wait() #等待老板讲话
17 print('我靠,一言不合就加班')
18 time.sleep(2)
19 event.clear() #清除第一次的event
20 event.wait() #二次等待老板发话
21 print('快走,下班咯!!!')
22 # event.clear()
23
24
25 if __name__=='__main__':
26 event=threading.Event() #创建一个线程同步对象
27
28 l=[]
29 for i in range(4):
30 l.append(Worker())
31 l.append(Boss())
32
33 for t in l:
34 t.start()
35
36 for t in l:
37 t.join()
38
39 print('the end...')
线程同步锁的启用:threading.Lock
1 import threading
2 import time
3
4
5 def sun():
6 global n
7
8 lock.acquire() #启用
9 temp=n
10 time.sleep(0.001)
11 n=temp+1
12 lock.release() #释放
13
14 n=0
15 lock=threading.Lock() #一个同步锁对象
16 lis=[]
17 for i in range(100):
18 t=threading.Thread(target=sun)
19 t.start()
20 lis.append(t)
21
22 for k in lis:
23 k.join()
24
25 print(n)
信号量 Semaphore() 同时可以开几个进程 不填参数则默认为1个
1 import time
2 import threading
3 class MyThread(threading.Thread):
4 def run(self):
5 pass
6
7 class Show(threading.Thread):
8 def run(self):
9 if sen.acquire():
10 print(self.name)
11 time.sleep(2)
12 sen.release()
13
14 if __name__=='__main__':
15 sen=threading.Semaphore(5) #一次可以同时进来五个
16 lis=[]
17 for i in range(20):
18 lis.append(Show())
19
20 for t in lis:
21 t.start()
22 for t in lis:
23 t.join()
24
25 print('the end。。。')
队列queue:一种新的数据结构用来解决线程安全问题
1 import queue
2 q=queue.Queue(5) #先进先出
3 q=queue.LifoQueue(5) #先进后出
4 q=queue.PriorityQueue(5) #按优先级输出 序号小的先输出 数值必须放在列表里面
5
6 q.put([2,'kevin'])
7 q.put([1,23])
8 q.put([4,['a','b','c']])
9 q.put([3,{'name':'jim'}])
10
11 while True:
12 print(q.get()[1])
13 print('***********')
生产者消费者模式:通过一个容器来取消二者的强耦合性 用队列来使二者达到平衡关系
1 import threading 2 import queue 3 import time 4 q=queue.Queue() 5 6 def Scz(name): #生产者 7 count=0 8 while count<10: 9 print('making ……') 10 time.sleep(2) 11 q.put(count) 12 13 print('%s做好了第%s个包子'%(name,count)) 14 count += 1 15 q.task_done() 16 print('ok') 17 18 def Xfz(name):#消费者 19 count=0 20 while count<10: 21 time.sleep(5) 22 print('waitting……') 23 q.join() 24 data=q.get() 25 # q.join() 26 print('%s吃了第%s个包子'%(name,data)) 27 count+=1 28 29 s=threading.Thread(target=Scz,args=('厨师',)) 30 x1=threading.Thread(target=Xfz,args=('消费者1',)) #args必须为元组接收参数 31 x2=threading.Thread(target=Xfz,args=('消费者2',)) 32 x3=threading.Thread(target=Xfz,args=('消费者3',)) 33 34 s.start() 35 x1.start() 36 x2.start() 37 x3.start()