zoukankan      html  css  js  c++  java
  • 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()

    线程同步

  • 相关阅读:
    codeforce842c Ilya And The Tree
    UVA11825 Hackers' Crackdown
    UVA10635 Prince and Princess
    hihocoder1327 分隔相同字符贪心
    2018 Multi-University Training Contest 3 1003 / hdu6321 Problem C. Dynamic Graph Matching 状压dp
    2018 Multi-University Training Contest 3 1001 / hdu6319 Problem A. Ascending Rating 单调队列,思维
    第十四届华中科技大学程序设计竞赛决赛同步赛
    The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple / ZOJ4027 Sequence Swapping dp递推
    gym101485G/BZOJ4430 Guessing Camels赌骆驼 树状数组或CDQ分治
    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 Clever King 最大权闭合子图
  • 原文地址:https://www.cnblogs.com/lldxz/p/11690581.html
Copyright © 2011-2022 走看看