# 多线程和多进程
- 程序:一堆代码以文本形式存入一个文档
- 进程:程序运行的一个状态
- 包含地址空间,内存,数据栈等等
- 每个进程有自己的完全独立的运行环境,多进程共享数据是一个问题
- 线程
- 一个进程的独立运行片段,一个进程可以有多个线程
- 线程可以理解为轻量化的进程
- 一个进程的多个线程间共享数据和上下文运行环境
- 互斥问题
- 全局解释器锁(GIL)--UnderstandingGIL-book
- pyhton代码的执行是由python虚拟机进行控制
- 在主循环中只能有一个控制线程在执行
- python包
- thread: 有问题 不好用,python3 的名字叫_thread
- threading 通用的包
## - threading的使用
1. 方法1
- 直接利用threading.Thread生成Thread实例
- 1。 t = threading.Thread(target=xxx, args=(xxx,))
- 2。 t.start():启动多线程
- 3。 t.join():等待多线程执行完成
- 守护线程:和主线程一样
- t.setDaemon(True)
- 如果在程序中把子线程设置成了守护线程,则子线程在主线程结束的时候就自动退出
- 一般认为守护线程不脱离主线程单独运行
- 守护线程的执行效果和环境有关
- 线程常用属性:
- threading.currentThread:返回当前线程变量
- threading.enumerate:返回一个包含正在运行的线程的list
- threading.activeCount :返回正在运行的线程数量
- thr.setName:给线程设置名字
- thr.getName:得到正在运行的线程的名字
2. 方法2
- 直接继承自threading.Thread
- 直接继承Thread
- 重写run函数 run函数的内容也就是直接使用的时候指定的函数的功能
- 类实例可以直接运行
- 继承注意事项:
- init函数可以不写,要写一定要调用父类的init
- 必须重写run函数,run函数代表的是真正的功能
## 共享变量
- 当多个线程同时访问一个变量的时候,会产生共享变量的问题
- 解决方案:锁,信号灯
- 锁(Lock)
- 是一个标志,表示一个线程在占用一些资源
- 使用方法:
- 上锁
- 使用共享资源,随便用
- 取消锁,释放资源
#具体方法:
lock = threading.Lock() #定义一个锁
lock.acquire() #申请一个锁
##然后操作相应的资源
lock.release()
#注意事项:
1. 锁谁
2. 理解锁,锁不是锁住谁,而是一个令牌,
## 线程安全问题
- 如果一个资源,不加锁也不会引起任何问题,则成为线程安全
- 线程不安全变量类型 list、set、dict
- 线程安全变量类型 queue
## 生产者消费者问题
-queue存放变量的数据结构,特点:先进先出,可以理解为特殊的list
~~~
#python2 from Queue import Queue
#python3 import queue
~~~
本文详细介绍了多线程和多进程的概念及其在Python中的应用。内容包括进程与线程的区别、Python中如何实现多线程、共享变量的问题及解决方法、生产者消费者问题的处理等。
1508

被折叠的 条评论
为什么被折叠?



