Python第25课:多线程
时间 2019-02-22 下午3:30
主讲 刘培富
地点 四楼电教室
在没有用的多线程之前,我们实际上是单线程在执行程序。所有代码,一行一行执行,前面的没执行完,后面的就要排队等待。
如果任务比较多,每个任务又分别要耗费不少时间,这时,如果仍然使用单线程,效率就会很低。对于这种情况,我们就需要使用多线程,最大限度地应用CPU和内存资源,使程序的执行效率最大化。
举例,有以下程序,先用单线程运行,用时35秒。代码和效果如下:
import time,datetime
starttime = datetime.datetime.now()
for iin range(1,11):
print("●第一个任务之%d,时间是%s"%(i,datetime.datetime.now()))
time.sleep(2)
print("第一个任务执行完毕")
for iin range(1,6):
print("★第二个任务之%d,时间是%s"%(i,datetime.datetime.now()))
time.sleep(3)
print("第二个任务执行完毕")
endtime = datetime.datetime.now()
print("执行本程序,用时"+str(int((endtime - starttime).total_seconds()))+"秒")
![](https://img.haomeiwen.com/i11638027/a8fac1275632608f.jpg)
单线程运行35秒,现在进行代码改造,改成多线程:
import time,datetime,threading
starttime = datetime.datetime.now()
def diyi(x):
for iin range(1,11):
print("●第一个任务之%d,时间是%s,收到参数%s"%(i,datetime.datetime.now(),x))
time.sleep(2)
print("第一个任务执行完毕")
def dier(x):
for iin range(1,6):
print("★第二个任务之%d,时间是%s,收到参数%s"%(i,datetime.datetime.now(),x))
time.sleep(3)
print("第二个任务执行完毕")
threads=[]
threads.append(threading.Thread(target=diyi,args=("1")))#子线程1
threads.append(threading.Thread(target=dier,args=("2")))#子线程2
for tin threads:
t.setDaemon(True)
t.start()
for iin threads:
i.join()
endtime = datetime.datetime.now()
print("执行本程序,用时"+str(int((endtime - starttime).total_seconds()))+"秒")
![](https://img.haomeiwen.com/i11638027/86b99ff17babb8d9.jpg)
可见,改造后,同样的程序,仅使用20秒,执行效率提升15秒。
说明:
1,多线程需要使用模块 threading
2,threading.Thread(target=diyi,args=("1"))用于线程调用函数和传递参数,可见,自定义的线程,表现为一个自定义函数,或者说,打包(封装)在这个自定义函数中。
3,每个自定义的线程,都是子线程。原有主程序为主线程。如例所示,自定义2个子线程,加上主线程,共3个线程。
4,关于线程守护:正常情况,即t.setDaemon(True),子线程运行的同时,主线程将继续,且主线程结束后,无论子线程是否结束,强制子线程结束。如果设置setDaemon(False),则主线程结束后,对应的子线程将继续,直至自行结束。
5,关于线程阻塞:为了防止主线程跳过子线程继续执行,往往需要使用t.join()阻塞主线程。而如上例所使用for i in threads i.join(),可以完美地阻塞主线程,直至所有子线程结束。
网友评论