python线程--threading模块

渊源

  为了摆脱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()

 

线程同步

 

posted @ 2019-10-18 14:14  懒懒的小猪  阅读(372)  评论(0编辑  收藏  举报