1、线程和进程
计算机资源,指的是cpu计算资源、内存资源、接口读写资源等。
进程:计算机中用于分配资源的最小个体。不同进程之间并不共享内存。
线程:是进程内部的资源分配对象,一个进程最少会有一个线程。同一进程下的不同线程可以共享内存。
2、并行和并发
并行:同一时间段,交替前行。并发:同时发生。
对于单核CPU、早期伪多核CPU、以及某些编程语言而言,实际多线程是并行实现并发效果。
多线程的用处:
(1)对于重复读写端口、等待响应这类程序,可以使用多线程进行并发的操作,提高效率
(2)多线程可以将其他任务放在后台执行,不影响主线程序响应用户操作,尤其是GUI环境
3、模块
python3有__thread和threading两个模块可以分别实现多线程功能。
其中__thread模块是废弃的thread模块的替代,不建议使用,只是为了考虑python3的兼容,功能也较少。所以也不做分析。
threading是推荐使用,支持功能更多。
4、threading模块
4.1 基于继承线程类实现
(1)定义线程类,继承threading.Thread类,将本类对象self通过threading.Thread.__init__方法绑定到线程机制。
(2)定义run方法。run方法具备了线程性质,会被线程类创建的对象调用start方法时启动。
(3)创建线程类对象,可以是多个对象,每个对象都可以通过start方法启动开始执行其run方法
4.2 基于直接创建线程类对象实现
def my_ui_set(self):
self.pushButton_1.clicked.connect(self.listen)
self.workspace_path = ''
def listen(self):
thread = threading.Thread(target=self.listen_thread)
thread.start()
def listen_thread(self):
os.system('mitmdump -s web_listener_listen.py')
4.3 模块函数
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
5、threading.Thread类
这是threading模块下的核心类。
5.1 类和初始化
class Thread:
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):
group 应该为None,作为未来的扩展当ThreadGroup类被实现
target,指调用的线程方法。如果是继承Thread类,那么实际过程就是调用子类重写的run方法。如果是直接通过Thread初始化,那么需要显式的指定目标方法或函数。
name 线程名称,默认情况下,唯一名称由形式为“Thread-N”,其中N是小的十进制数。
args 是target指向方法调用的参数元组,默认是()
kwargs 是target调用的关键字参数字典,默认是{}
3、属性
_initialized = False
4、方法
(1)start
启动线程,执行target对应的方法或函数
(2)run
Thread类的子类需要重写该方法,定义线程执行的任务代码
(3)join
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
将当前线程加入到主线程中,即当前线程执行完后不会直接关闭程序,而是由主线程决定
默认的,当线程执行完后,会关闭程序
(4)name
获取设置的name属性,str类型
(5)其他
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。