1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| 线程 : 一个qq, 可以语音, 可以视频, 一个暴风影音, 可以播放音频, 播放视频, 一个word文档, 可以编辑, 可以实时检查和保存等
一个进程里面如果只有一个线程, 称之为主线程, 如果还有其他线程, 称之为子线程
CPU切换的基本单位是线程
多进程 : 切换进程消耗资源大, 但是稳定, 如果一个子进程挂了, 不影响其他进程
多线程 : 切换线程消耗资源小, 但是不稳定, 如果一个线程挂了, 整个进程就挂了
线程创建 (thread): (1) 面向过程 t = threading.Thread(target=xxx, name=xxx, args=(xxx, )) target : 线程启动执行函数 name : 线程的名字 args : 给子线程传递参数 threading.current_thread().name : 获取线程名字 t.start() : 启动线程 t.join() : 让主线程等待 (2) 面向对象 class MyThread(threading.Thread): def run(self): pass 如果传递参数, 需要重写构造方法, 注意手动调用父类构造方法 线程之间能否共享局部变量 不共享 线程之间是否共享全局变量 共享 线程安全 使用线程锁来解决, 谁先抢到谁先用 from threading import Lock lock = Lock() lock.acquire() lock.release() 队列 : 队列 : 买火车票, 先进先出 栈 : 先进后出 函数的运行 - main函数 使用队列? from queue import Queue q = Queue(5) q.put('xxx') q.put('xxx', False) 如果队列满, 立即抛出异常 q.put('xxx', True, 5) 如果队列满, 5s之后抛出异常 获取元素 q.get() q.get(False) 如果队列为空, 立即抛出异常 q.get(True, 5) 如果队列为空, 5s之后抛出异常 q.full() : 队列是否满 q.empty() : 队列是否空 q.qsize() : 队列的元素的个数 线程加队列 --- 生产者消费者模型 while 1: 生产数据 消费数据 生产数据线程 队列 消费数据线程
|