zoukankan      html  css  js  c++  java
  • Python 多线程实例

    一、直接调用

    #!/usr/bin/python
    # -*- coding : utf-8 -*-
    # 作者: Presley
    # 时间: 2018-11-19
    # 邮箱:1209989516@qq.com
    # 这是我用来练习python多线程的测试脚本
    
    import threading
    import time
    
    
    def sayhi(num): #定义每个线程要运行的函数
        print("runnin on number:%s" %num)
        time.sleep(3)
    
    if __name__ == "__main__":
        t1 = threading.Thread(target=sayhi,args=(1,))
        t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一个线程实例
        t1.start() #启动线程
        t2.start() #启动另一个线程
        print(t1.getName())
        print(t2.getName())

    二、继承的方式启动一个线程

    #!/usr/bin/python
    # -*- coding : utf-8 -*-
    # 作者: Presley
    # 时间: 2018-11-19
    # 邮箱:1209989516@qq.com
    # 这是我用来练习python多线程的测试脚本
    
    import threading
    import time
    
    
    class MyThread(threading.Thread):
        def __init__(self,num):
            threading.Thread.__init__(self) #经典类的继承方法
            self.num = num
        def run(self): #定义每个线程要运行的函数 #这个类里面必须要写run这个方法并且必须写死了只能叫run, 线程.start即执行这个方法
            print("running on number:%s" %self.num)
            time.sleep(3)
    if __name__ == "__main__":
        t1 = MyThread(1)
        t2 = MyThread(2)
        t1.start()
        t2.start()
        print(t1.getName())
        print(t2.getName())

    三、join (等待线程执行完后才执行下一步)

    #!/usr/bin/python
    # -*- coding : utf-8 -*-
    # 作者: Presley
    # 时间: 2018-11-19
    # 邮箱:1209989516@qq.com
    # 这是我用来练习python多线程的测试脚本
    
    import threading
    import time
    
    
    class MyThread(threading.Thread):
        def __init__(self,num):
            threading.Thread.__init__(self) #经典类的继承方法
            self.num = num
        def run(self): #定义每个线程要运行的函数 #这个类里面必须要写run这个方法并且必须写死了只能叫run, 线程.start即执行这个方法
            print("running on number:%s" %self.num)
            time.sleep(3)
    
    if __name__ == "__main__":
        t1 = MyThread(1)
        t2 = MyThread(2)
        t1.start()
        t2.start()
        print(t1.getName())
        print(t2.getName())
        t1.join() #等待t1执行完后执行下一步即t1.wait()
        t2.join()#等待t2执行完后执行下一步 即t2.wait()
        print("--main--")

    四、并行等待,等最后一个线程执行完后执行下一步

    #!/usr/bin/python
    # -*- coding : utf-8 -*-
    # 作者: Presley
    # 时间: 2018-11-19
    # 邮箱:1209989516@qq.com
    # 这是我用来练习python多线程的测试脚本
    
    import threading
    import time
    
    
    def sayhi(num): #定义每个线程要运行的函数
        print("runnin on number:%s" %num)
        time.sleep(3)
    
    if __name__ == "__main__":
        t_list = []
        for i in range(10):
            t = threading.Thread(target=sayhi,args=[i,])
            t.start()
            t_list.append(t)
        for i in t_list:
            i.join()
        print("--main--")

     五、setDaemon

      程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法了。

      1、

    import threading
    import time
    class MyThread(threading.Thread):
            def __init__(self,id):
                    threading.Thread.__init__(self)
            def run(self):
                    time.sleep(5)
                    print "This is " + self.getName()
     
    if __name__ == "__main__":
            t1=MyThread(999)
            t1.setDaemon(True)
            t1.start()
            print "I am the father thread."

      执行结果:

    I am the father thread.

       2、

    #!/usr/bin/python
    # -*- coding : utf-8 -*-
    # 作者: Presley
    # 时间: 2018-11-19
    # 邮箱:1209989516@qq.com
    # 这是我用来练习python多线程的测试脚本
    
    import threading
    import time
    
    
    def run(n):
        print("[%s]------running------
    " %n)
        time.sleep(4)
        print("done")
    
    def main():
        for i in range(5):
            print('aaa')
            print('bbb')
            print('ccc')
            t = threading.Thread(target=run,args=[i,])
            #time.sleep(1)
            t.start()
            t.join()
            print("starting thread",t.getName())
            print('ddd')
    
    
    m = threading.Thread(target=main,args=[])
    m.setDaemon(True) #主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。
    
    m.start()
    
    m.join() #里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。
    
    print("--main thread done--")

    执行结果:

    aaa
    bbb
    ccc
    [0]------running------
    
    done
    starting thread Thread-2
    ddd
    aaa
    bbb
    ccc
    [1]------running------
    
    done
    starting thread Thread-3
    ddd
    aaa
    bbb
    ccc
    [2]------running------
    
    done
    starting thread Thread-4
    ddd
    aaa
    bbb
    ccc
    [3]------running------
    
    done
    starting thread Thread-5
    ddd
    aaa
    bbb
    ccc
    [4]------running------
    
    done
    starting thread Thread-6
    ddd
    --main thread done--

     若main方法中去掉t.join结果为

    aaa
    bbb
    ccc
    [0]------running------
    starting thread Thread-2
    ddd
    aaa
    bbb
    ccc
    
    [1]------running------
    starting thread Thread-3
    ddd
    aaa
    bbb
    ccc
    
    [2]------running------
    starting thread Thread-4
    ddd
    aaa
    bbb
    ccc
    
    [3]------running------
    
    starting thread Thread-5
    ddd
    aaa
    bbb
    ccc
    [4]------running------
    starting thread Thread-6
    ddd
    
    --main thread done--
  • 相关阅读:
    多表联合查询,利用 concat 模糊搜索
    order by 中利用 case when 排序
    Quartz.NET 3.0.7 + MySql 动态调度作业+动态切换版本+多作业引用同一程序集不同版本+持久化+集群(一)
    ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
    ASP.NET Core 2.2 基础知识(十七) SignalR 一个极其简陋的聊天室
    ASP.NET Core 2.2 基础知识(十六) SignalR 概述
    ASP.NET Core 2.2 基础知识(十五) Swagger
    ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
    linux磁盘管理 磁盘查看操作
    linux磁盘管理 文件挂载
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/9985587.html
Copyright © 2011-2022 走看看