一、进程与线程
1.区别
进程:一个程序要运行时所需要的所有资源的集合,进程是资源的集合。
一个进程至少需要一个线程,这个线程称为主线程
一个进程里面可以有多个线程
两个进程之间的数据是完全独立,不能互相访问。
线程:一道单一的指令控制流,寄生在进程中。
单一进程里多个进程是共享数据的,多个线程在涉及修改同一个数据时,要加锁。
2.线程调用方法
import threading import time def sayhi(num): #定义每个线程要运行的函数 print("running on number:%s" %num) time.sleep(3) if __name__ == '__main__': t1 = threading.Thread(target=sayhi,args=(1,)) #生成一个线程实例 t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一个线程实例 t1.start() #启动线程 t2.start() #启动另一个线程 print(t1.getName()) #获取线程名 print(t2.getName())
1 import threading 2 import time 3 4 def sayhi(num): #定义每个线程要运行的函数 5 6 print("running on number:%s" %num) 7 8 time.sleep(3) 9 10 if __name__ == '__main__': 11 12 t1 = threading.Thread(target=sayhi,args=(1,)) #生成一个线程实例 13 t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一个线程实例 14 15 t1.start() #启动线程 16 t2.start() #启动另一个线程 17 18 print(t1.getName()) #获取线程名 19 print(t2.getName())
3.守护线程
守护线程一旦退出,其子线程都会退出。
代码举例如下:
1 import time 2 import threading 3 4 5 def run(n): 6 7 print('[%s]------running---- ' % n) 8 time.sleep(2) 9 print('--done--') 10 11 def main(): 12 for i in range(5): 13 t = threading.Thread(target=run,args=[i,]) 14 t.start() 15 t.join(1) 16 print('starting thread', t.getName()) 17 18 19 m = threading.Thread(target=main,args=[]) 20 m.setDaemon(True) #将main线程设置为Daemon线程,它做为程序主线程的守护线程,当主线程退出时,m线程也会退出,由m启动的其它子线程会同时退出,不管是否执行完任务 21 m.start() 22 m.join(timeout=2) 23 print("---main thread done----")
4.线程锁
多个线程修改同一个数据时要加锁。
1 import time 2 import threading 3 4 def addNum(): 5 global num #在每个线程中都获取这个全局变量 6 print('--get num:',num ) 7 time.sleep(1) 8 lock.acquire() #修改数据前加锁 9 num -=1 #对此公共变量进行-1操作 10 lock.release() #修改后释放 11 12 num = 100 #设定一个共享变量 13 thread_list = [] 14 lock = threading.Lock() #生成全局锁 15 for i in range(100): 16 t = threading.Thread(target=addNum) 17 t.start() 18 thread_list.append(t) 19 20 for t in thread_list: #等待所有线程执行完毕 21 t.join() 22 23 print('final num:', num )
5.semaphore(信号量)
1 import threading,time 2 3 def run(n): 4 semaphore.acquire() 5 time.sleep(1) 6 print("run the thread: %s " %n) 7 semaphore.release() 8 9 if __name__ == '__main__': 10 11 num= 0 12 semaphore = threading.BoundedSemaphore(5) #最多允许5个线程同时运行 13 for i in range(20): 14 t = threading.Thread(target=run,args=(i,)) 15 t.start() 16 17 while threading.active_count() != 1: 18 pass #print threading.active_count() 19 else: 20 print('----all threads done---') 21 print(num)
6.Event
event有三个指令,event.set(),event.wait(),event.clear(),通过event实现多个线程间的交互。
交通指挥灯实例:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:Liumj 4 import threading 5 import time 6 def lighter(): 7 count = 0 8 while True: 9 if count<30: 10 if not event.is_set(): 11 event.set() 12 print("