• python线程


    线程(threading)运行在进程内部,可以访问进程中所有内容,multiprocessing 和 threading 的区别之一就是 threading 没有 terminate() 函数。很难终 止一个正在运行的线程,因为这可能会引起代码和时空连续性上的各种问题。要使用线程,程序中所用代码以及程序使用的外部库中的代码,必须是线程安全。没有全局变量是线程非常有用并且安全,线程不会应为数据打架,应为每个线程都是完全独立的。

    但线程有时需要修改全局变量,要实现数据共享,这时可以通过让线程在修改变量前加软件锁,这样在进行修改时其他线程会等待。Python多线程用于I/O操作密集型的任务。

    线程模块

    python中常用的模块为threading。

    该模块下常见函数:

    active_count()//返回当前存活的线程类对象,线程个数=主线程+子线程

    current_thread()//返回当前调用者的控制线程的对象。

    get_ident()//返回当前线程的‘线程标识符’。

    线程对象:

    一个线程可以被标记为“守护线程”,即表示守护线程终结,整个程序才会退出,通过daemon属性来标识。

    start():开始线程,一个线程最多只能被调用一次。被安排在对象run()方法一个独立的控制进程中。

    run():表示线程开始活动。

    join():等待,直到线程结束,这会阻塞调用这个方法的线程,直到join()的线程终结,一个线程可以被多次调用该对象。

    name:只用于标识的字符串。

    ident:这个线程的‘线程标识符’,若线程未开始则为None。

    is_value():返回线程是否存活。

    daemon:表示这个线程是否为守护线程,在调用start()前设置好。初始值继承于创建线程;主线程不是守护线程,默认都为daemon=False。

    多线程的创建可以分为函数式和类模式创建

    函数式:

     1 import threading
     2 import time,random
     3 
     4 def do_This(strName):
     5     for n in range(1,4):
     6         print("{0}	{1}".format(threading.current_thread().getName(),strName))#返回当前调用者控制线程名
     7         time.sleep(3)
     8     #当前调用者的控制线程对象和当前存活线程数
     9     print("{0}	{1}".format(threading.current_thread(),threading.active_count()))
    10 
    11        
    12 if __name__=='__main__':
    13     #线程创建方式,target表示调用函数,args表示当前调用函数传递的参数,name可以为默认值,即可以不用指定,系统自动赋值
    14     th1=threading.Thread(target=do_This,args=("Hello!",),name="threading1")
    15     th2=threading.Thread(target=do_This,args=("World!",))
    16 
    17     th1.start()#开启线程
    18     th2.start()
    19     
    20     th1.join()#等待线程终止
    21     th2.join()
    22     print('{0}线程结束'.format(threading.current_thread().getName()))

    结果:

    threading1  Hello!
    Thread-1    World!
    threading1  Hello!
    Thread-1    World!
    threading1  Hello!
    Thread-1    World!
    <Thread(Thread-1, started 2756)>    3
    <Thread(threading1, started 11012)> 2
    MainThread线程结束
     
    类模式:
    import threading
    import time,random
    
    class mulitThraed(threading.Thread):
        def __init__(self,theadStr):
            threading.Thread.__init__(self)
            self.name=theadStr
        
        def run(self):
            for n in range(1,4):
                print("{0}	{1}".format(threading.current_thread().getName(),str(n)))
                time.sleep(3)
    
    if __name__=='__main__':
        c_th1=mulitThraed("Hello1")
        c_th2=mulitThraed("Hello2")
        
        c_th1.start()
        c_th2.start()
        
        c_th1.join()
        c_th2.join()
        print('{0}线程结束'.format(threading.current_thread().getName()))
    结果:
    Hello1    1
    Hello2    1
    Hello1    2
    Hello2    2
    Hello1    3
    Hello2    3
    MainThread线程结束

    注上面两个程序运行结果在每次运行都可能会有差异(子线程并行运行),若将join()对象注释掉,就会导致主线程与子线程并行,若加上join()主线程会等待所有子线程结束后才开始,各个子线程之间不用相互等待,并行运行。

    守护线程

    对于守护线程,只要主程序执行完毕,不管子线程还有没有执行完程序都会退出。

    在多线程开发中,如果子线程设定为了守护线程,守护线程会等待主线程运行完毕后被销毁。一个主线程可以设置多个守护线程,守护线程运行的前提是,主线程必须存在,如果主线程不存在了,守护线程会被销毁。

    import threading
    import time,random
    
    
    def Test(strName):
        print("Thread :{0}".format(strName))
        time.sleep(2)
        
    if __name__=="__main__":
        for n in range(1,4):
            t=threading.Thread(target=Test,args=("deamon {0}".format(n),))
            t1=threading.Thread(target=Test,args=(n,))
            t.daemon=True   #设置为守护线程
            t.start()
            t1.start()  #常规线程
        print("{0}	存活线程数:{1}".format(threading.current_thread().getName(),threading.active_count()))
    结果:
    Thread :deamon 1 Thread :1 Thread :deamon 2 Thread :2 Thread :deamon 3 Thread :3 MainThread 存活线程数:7
  • 相关阅读:
    .NET Windows服务开发流程
    SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
    SQL触发器批量删除数据库中的表
    如何使用Chrome Timeline 工具(译)
    修复运行 tasklist 命令时提示 ERROR: Not found
    删除坏掉的 Active Directory Domain
    为 WSUS 服务器定期运行清理向导
    为 Exchange 服务器编写自定义的反垃圾插件
    Windows 10 下安装 npm 后全局 node_modules 和 npm-cache 文件夹的设置
    在 Win10 命令行使用 Consolas + 微软雅黑
  • 原文地址:https://www.cnblogs.com/2019zjp/p/11801745.html
Copyright © 2020-2023  润新知