线程
- 默认情况下,一个进程有且只有一个线程,这个线程叫做主线程
threading 模块中的Thread类就是线程类,这个类的对象就是线程对象,一个线程对象对应一个子线程
(需要一个子线程就创建一个Thread类的对象)
# 2.在3个子线程中同时下载三个电影
"""
Tread(target, args) ---- 创建子线程对象(关键字参数)
说明:
target - Function,需要传一个函数(这个函数中的内容会在子线程中执行)
args - target对应的函数参数
当通过创建好的子线程对象调用start方法的时候,会自动在子线程中条用target对应的函数
并且将args中的值作为实参
"""
t1 = threading.Thread(target=download, args=('郭锐1.avi',))
t2 = threading.Thread(target=download, args=('郭锐3.avi',))
t3 = threading.Thread(target=download, args=('郭锐2.avi',))
# 开始执行对应的任务
t1.start()
t2.start()
t3.start()
print('===============================')
运行结果:
程序开始
2019-01-17 17:33:42.673232:郭锐1.avi 开始下载
2019-01-17 17:33:42.673232:郭锐3.avi 开始下载
2019-01-17 17:33:42.673232:郭锐2.avi 开始下载
===============================
2019-01-17 17:33:52.673895:郭锐1.avi 下载完成
2019-01-17 17:33:52.674892:郭锐3.avi 下载完成
2019-01-17 17:33:52.674892:郭锐2.avi 下载完成
-
可以通过写一个类,继承Thread的类,来创建属于自己的线程类
1.声明类继承Tread
2.重写类的run方法,这个方法中的任务就是需要在子线程中执行的任务
3.需要线程对象的时候,创建当前声明的类的对象,还是通过start方法在子线程中去执行run方法中的任务class DownloadThread(threading.Thread): """下载类""" def __init__(self, file): super().__init__() self.file = file def run(self): # print(datetime.now()) print('开始下载:' + self.file) # print('run:', threading.current_thread()) t = randint(5, 10) time.sleep(t) print(self.file + ' 下载结束', end=' ') print('耗时%d秒' % t) # print(datetime.now()) def creat_thread(): t1 = DownloadThread('电锯惊魂') t1.start() t2 = DownloadThread('熊出没') t2.start() t3 = DownloadThread('喜洋洋与灰太狼') t3.start() t1.join() t2.join() t3.join() print('==========下载结束============') global flag flag = False def main(): # 获取当前线程 # print(threading.current_thread()) # 调用start方法会自动在子线程中调用run方法 # 注意:如果直接用对象调用run方法,会在主线程执行 t0 = threading.Thread(target=creat_thread) t0.start() for i in range(100): time.sleep(1) print(i) if not flag: break if __name__ == '__main__': main()
join
# 线程对象调用join方法,会导致join后的代码在线程中的任务结束后才执行