美文网首页
python—多线程threading

python—多线程threading

作者: 小二哥很二 | 来源:发表于2019-07-25 10:14 被阅读0次

    一个进程中必定有一个主线程,线程自己不拥有系统资源。没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
    1、多线程的作用,就是让工作同时进行——join()阻塞

    
    import threading
    
    import time
    
    def work1(a):
    
        print('任务1开始了:',time.ctime())
    
        print('我是',a)
    
        time.sleep(4)
    
        print('任务1结束了:',time.ctime())
    
    def work2(b):
    
        print('任务2开始了:',time.ctime())
    
        print('我喜欢',b)
    
        time.sleep(2)
    
        print('任务2结束了:',time.ctime())
    
    print('开始主线程执行.....',time.ctime())
    
    t1=threading.Thread(target=work1,args=('大帅哥',))
    
    t2=threading.Thread(target=work2,args=('大美女',))
    
    t1.start()
    
    t2.start()
    
    # t1.join()
    
    # t2.join()  阻塞
    
    time.sleep(2)
    
    print('结束主线程执行.....',time.ctime())
    

    说明:
    1)此脚本,是非保护线程,即当主线程2秒结束后,子线程t1还在休眠,所以会继续执行,总用时间是t1的时间4秒

    image.png

    2)而加上.join(),代表主程序等待子线程执行完毕再退出,只有一个参数,如.join(2),即等待子线程t1 2秒,如果没结束,就强制结束。.join()的作用就是阻塞~!等待t1执行完,主线程等待2秒结束,一共用时6秒,性能不高。


    image.png

    2、返回线程thread对象列表

    def worker():
    
        print('test')
    
        time.sleep(2)
    
    threads=[]
    
    for i in range(5):
    
        t=threading.Thread(target=worker)
    
        threads.append(t)
    
        t.start()
    
    for item in threading.enumerate():
    
        print(item)
    
    for item in threads:
    
        print(item)
    
    image.png

    3、守护主线程:即当主线程结束时,子线程没结束的,不予处理 setDaemon(True)

    import threading
    
    import time
    
    def work1(a):
    
        print('任务1开始了:',time.ctime())
    
        print('我是',a)
    
        time.sleep(4)
    
        print('任务1结束了:',time.ctime())
    
    def work2(b):
    
        print('任务2开始了:',time.ctime())
    
        print('我喜欢',b)
    
        time.sleep(2)
    
        print('任务2结束了:',time.ctime())
    
    print('开始主线程执行.....',time.ctime())
    
    t1=threading.Thread(target=work1,args=('大帅哥',))
    
    t2=threading.Thread(target=work2,args=('大美女',))
    
    t1.setDaemon(True)                                #setDaemon一定要写在start前,否则报错
    
    t2.setDaemon(True)
    
    t1.start()
    
    t2.start()
    
    time.sleep(3)
    
    print('结束主线程执行.....',time.ctime())
    
    image.png

    4、Timer:定时执行

    import threading
    import time
    from threading import Timer
    
    def work1(a):
        print('任务1开始了:',time.ctime())
        print('我是',a)
        time.sleep(4)
        print('任务1结束了:',time.ctime())
    
    def work2(b):
        print('任务2开始了:',time.ctime())
        print('我喜欢',b)
        time.sleep(2)
        print('任务2结束了:',time.ctime())
    
    t1=threading.Thread(target=work1,args=('大帅哥',))
    # t2=threading.Thread(target=work2,args=('大美女',))
    t1.start()
    t=Timer(5,work2,args=['大美女'])
    t.start()
    

    任务1开始了: Thu Jul 25 14:36:17 2019
    我是 大帅哥
    任务1结束了: Thu Jul 25 14:36:21 2019
    任务2开始了: Thu Jul 25 14:36:22 2019
    我喜欢 大美女
    任务2结束了: Thu Jul 25 14:36:24 2019

    说明:以上结果可以看出,t1在4s时结束,t2设置的是5s后再开始执行
    ※再来看一条例子:

    import threading
    import datetime
    interval_time=3
    def test(ms):
        now=datetime.datetime.now()
        now_new=now.strftime('%Y-%m-%d %H:%M:%S')
        print(f'{now_new}:I love you python')
        #ms:指定的时间 ;test:要执行的方法;[ms,]:方法的参数
        threading.Timer(ms,test,[ms,]).start()
    if __name__ == '__main__':
        print('任务开始:',datetime.datetime.now())
        test(interval_time)
    
    执行结果:
    任务开始: 2019-12-12 08:57:23.551809
    2019-12-12 08:57:23:I love you python
    2019-12-12 08:57:26:I love you python
    2019-12-12 08:57:29:I love you python
    

    相关文章

      网友评论

          本文标题:python—多线程threading

          本文链接:https://www.haomeiwen.com/subject/kwdcrctx.html