渊源 为了摆脱6点后加班 "等版本挂测升降级" 的宿命,python小白硬是写起了脚本。以下是用到的部分,惊喜。 --bs4. BeautifulSoup (为了监测固件是否编译完成) -- urllib.request.urlopen (为了
渊源
为了摆脱6点后加班 "等版本挂测升降级" 的宿命,python小白硬是写起了脚本。以下是用到的部分,惊喜。
--bs4.BeautifulSoup (为了监测固件是否编译完成) --urllib.request.urlopen (为了自动下载固件) --hashlib (为了校验下载下来的固件是否正确) --serial (为了自动烧写固件) --selenium.webdriver (为了自动页面升降级循环/自动重启循环) --threading (为了操作浏览器的同时记录串口日志) --类 (为了代码简洁而进行了封装)。
--re (正则表达式,功不可没)
线程概念
一个进程可有多个线程,这些线程共享该进程所拥有的全部资源。
python3线程模块
python3线程模块有两个threading和_thread,threading对_thread进行了封装。我们只需要使用threading这个模块就好。
threading模块
模块方法
- current_thread() 返回当前线程对象
- active_count() 返回当前活着的线程对象数量
Thread类
创建线程对象
import threading
threading.Thread(target=None, name=None, args=())
- target 需要调用的函数名
- name 线程名,自定义
- args 函数需要的参数,以元组( tuple)的形式传入
线程方法
- run() 用以表示线程活动的方法
- start() 启动线程
- join() 等待至线程中止
- getName() 返回线程名 threading.current_thread().getName()
- setDaemon(True) 设置为守护进程
创建线程类
直接创建threading.Thread的子类,来创建一个线程对象实现多线程。
通过继承Thread类,并重写Thread类的run()方法,在run()方法中定义具体要执行的任务。
在Thread类中,提供了一个start()方法用于启动新进程,线程启动后会自动调用run()方法。
import threading,time class MyThread(threading.Thread): def __init__(self, threadName,num): threading.Thread.__init__(self) self.name = threadName self.num = num def run(self): for i in range(self.num): print("{0} i={1}".format(threading.current_thread().getName(), i)) time.sleep(0.1) if __name__ == ‘__main__‘: t1 = MyThread("thread1",3) t1.start()创建线程类
守护线程
子线程用到join()函数,主线程需要依赖子线程执行完毕后才能继续执行代码;
子线程不用join()函数,主线程和子线程是并行运行的,没有依赖关系,主线程执行完了,子线程可能还在执行;
子线程设定为了守护线程,守护线程会等待主线程运行完毕后被销毁。一个主线程可以设置多个守护线程。
设置线程对象为守护线程,一定要在线程对象调用start()函数前设置。
Lock类
线程锁
多线程同时修改全局变量时会出现脏数据的线程安全问题。
解决方法:多线程访问时,采用加"互斥"锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。
# 创建锁对象 mutex = threading.Lock() # 获取锁,锁定 mutex.acquire() # 释放锁 mutex.release()
线程同步