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--
  • 相关阅读:
    php 解析json
    TP学习笔记一(tp的目录结构 , tp的输出方式)
    linux android真机测试
    SharedPreferences保存数据
    Volley用法
    android获得图片
    android 一条线
    android 获取时间
    Android_Spinner_Listener
    Android_Spinner_SimpleAdapter
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/9985587.html
Copyright © 2011-2022 走看看