python—多线程threading

2019-07-25  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读