线程是应用程序中的最小单元,即操作系统能够进行运算调度的最小单位,它包含在进程中,是进程中的实际运作单位,
一条线程指的是在进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务
每个进程至少包括一个线程,线程间的数据是共享的,每个进程也可生成多个子进程,子进程间的数据默认不共享
很多人一提到python多线程,就想到了GLI(global interpreter lock)全局解释锁,无论你启用多少线程,python在执行时,每次同一时刻,只允许一个线程执行任务,但是这个特性仅仅只是cpython解释器带来的,python这门语言设计并不是依赖于GLI运行的,比如Jpython,使用的是JLI,就不存在这个问题,
线程与进程区别
1.线程在进程之间是共享内存地址空间的,是通过进程创建的;进程拥有它自己的独立空间
2.线程直接访问它进程的数据块;进程是将父进程中数据再复制出一份使用
3.进程中的线程间是可以直接通信的;子进程与父进程间无非直接通信,但可以通过队列管道相互交流数据
4.一个新的线程创建很容易;一个新的进程创建需要从父进程里重新拷贝父进程的所有数据,耗费资源
5.在进程中的多线程间可以控制其他线程;进程只能控制它的子进程
6.改变主线程优先级会影响线程的在进程中的行为,改变父进程不会影响子进程,
1 import threading 2 import time 3 4 5 def say(msg): 6 print("say :{}".format(msg)) 7 time.sleep(2) 8 9 t = threading.Thread(target=say, args=(1,)) # 函数不能加括号,参数必须用逗号分隔 10 t.start() 11 12 print("over ???") # 程序并未在运行到这段代码时结束 13 14 15 def say(msg): 16 print("say :{}".format(msg)) 17 time.sleep(2) 18 19 t = threading.Thread(target=say, args=(1,)) 20 t.start() 21 t.join() 22 23 print("game over") # 通过join实现wait方式,最终执行完这段代码就结束了
通过类方式创建线程
1 class MyThread(threading.Thread): 2 def __init__(self, msg): 3 threading.Thread.__init__(self) # 经典类继承 4 # super(MyThread, self).__init__(self) 5 self.msg = msg 6 7 def run(self): # 必须在类中实现一个这个RUN方法,为线程start调用 8 time.sleep(2) 9 print(self.msg) 10 11 t = MyThread('hello') 12 t.start() 13 14 15 for i in range(10): 16 t = threading.Thread(target=say, args=(i,)) 17 t.start() 18 19 print("程序执行到这,未结束") 20 21 22 t_list = [] # 创建一个空列表,将线程实例加入进去 23 for i in range(10): 24 t = threading.Thread(target=say, args=(i,)) 25 t_list.append(t) 26 t.start() 27 print(t.getName()) # 获取线程名 28 29 30 for i in t_list: 31 i.join() 32 33 print("程序执行到这,结束了")
线程锁
1 #线程锁 2 num = 100 3 lock = threading.Lock() 4 5 6 def addNum(): 7 global num 8 print("get num {}".format(num)) 9 time.sleep(2) # 如果锁加在这,程序将等待200秒 10 lock.acquire() # 加上锁,实际上变成串行运行 11 num -= 1 12 lock.release() # 释放锁 13 14 t_list = [] 15 16 for i in range(100): 17 t = threading.Thread(target=addNum) 18 t.start() 19 t_list.append(t) 20 21 22 for i in t_list: 23 i.join() # 阻塞,等待 24 25 print("程序运行结束,num = [{}]".format(num))
红绿灯实例
1 #红绿灯 2 event = threading.Event() 3 def car(n): 4 while True: 5 time.sleep(1) 6 if event.isSet(): # 绿灯 7 print("car [%s] is running.." % n) 8 else: 9 print("car [%s] is waiting for the red light..." % n) 10 event.wait() 11 12 def light(): 13 if not event.isSet(): 14 event.set() # wait 就不阻塞, # 绿灯状态 15 count = 0 16 while True: 17 if count < 10: 18 print("