day18多线程
- 每个进程默认有一个线程,其他的是子线程
- Thread类:创建线程对象:Thread(target, args,kwargs)
- target:函数,需要在当前线程创建的子线程中去调用的函数
- args/kwargs:调用target中函数需要的实参列表
- 开始执行子线程的任务:线程对象.start();通过start方法在子线程中调用target对应的函数
- 一个进程中如果有多个线程,程序会在所有的线程都结束的时候才结束;发生异常崩溃指的是线程崩溃而不是进程
- 创建线程的两种方法:
from threading import Thread, currentThread, current_thread
import time
import datetime
# 方法一
def download(file_name):
print('%s downloading....' % file_name)
print(datetime.datetime.now())
time.sleep(5)
print('%s download ok' % file_name)
print(datetime.datetime.now())
t1 = Thread(target=download, args=('复联',))
t2 = Thread(target=download, args=('007',))
t1.start()
t2.start()
print('主线程')
# 方法二
class MyThread(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self): # 在子线程中执行的方法
print(current_thread().getName())
for i in range(1,6):
t = MyThread('线程%s' % i)
t.start()
- 子线程崩溃不会影响主线程或者其他子线程的执行
- join()方法:如果希望某个任务是在某个线程结束后才执行,那就将这个任务的代码放在对应线程对象调用join方法的后面
- 线程锁:from threading import Lock;当多个线程对同一个数据进行操作时,需要使用线程锁来保证这个数据的安全
from threading import Lock
mutex = Lock()
mutex.acquire() # 加锁
mutex.release() # 解锁
# 1.保证每个数据对应一个锁对象
# 2.操作数据前加锁,数据操作完成后释放锁