线程的创建与多线程
线程
线程创建的方式(一)
【使用此方式创建的线程为守护线程】
import _thread
import threading
def fn1(a,b):
print(a,b)
print(threading.current_thread().name)
def create_thread1():
#参数一:在子线程中要执行的函数
#参数二:子线程中的函数需要的参数,注意一定要以元组的形式传参
#使用此种方式创建的线程为守护线程,守护线程的特点是,当主线程结束,守护线程无论执行完毕都会结束
_thread.start_new_thread(fn1,("hello","yes"))
if __name__ == "__main__":
create_thread1()
print(threading.current_thread().name)
#注意此时创建的线程中的代码不会执行,原因是
#主线程执行的速度非常快,主线程执行结束,就直接退出了,因此我们的子线程根本不会被创建
#我们可以让主线程阻塞一段时间可以查看一下效果
#time.sleep(3) #这时候我们就可以查看打印的数据了
守护线程:子线程会随着主线程的结束而结束。
线程创建的方式(二)
import threading
def func1(*args):
print(args)
print(threading.current_thread().name)
def create_thread2():
#target:在子线程中要执行的函数
#deamo:是否为守护线程
#name:线程名称
t=threading.Thread(target=func1,deamo=False,name="BIG",args=("hello"))
t.start() #启动线程
if __name__ == "__main__":
create_thread2()
线程创建的方式(三)
import threading
class MyThread(threading.Thread):
def __init__(self):
super().__init__()
#一定要重写此方法,此方法会自动被调用
#里面的子线程
def run(self):
print("mythread",threading.current_thread().name)
def create_thread3():
t = MyThread()
t.run()
if __name__ == "__main__":
create_thread3()
注意一般情况下使用第二种创建方式比较常用
Thread(group=None, target=None, name=None, args=(), kwargs={})
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 线程名;
args/kwargs: 要传入方法的参数。
实例方法:
isAlive(): 返回线程是否在运行。正在运行指启动后、终止前。
get/setName(name): 获取/设置线程名。
start(): 线程准备就绪,等待CPU调度
is/setDaemon(bool): 获取/设置是后台线程(默认前台线程(False))。(在start之前设置)
#如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,主线程和后台线程均停止
#如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
join([timeout]): 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)。
多线程
一个进程运行时产生了多个线程。
import threading,time,random
def fun(*args):
time.sleep(random.randint(1,4))
print("子线程",args)
if __name__ == "__main__":
#多个线程同时运行,是异步执行
t1 = threading.Thread(target=fn,args=("包饺子",))
t1.start()
# t1.join() 会阻塞 等待t1线程执行完成后再继续往后执行
t2 = threading.Thread(target=fn,args=("甜馨",))
t2.start()
t3 = threading.Thread(target=fn,args=("嗯哼",))
t3.start()
#若多个线程想让其按顺序执行,则可以使用join() 的方法
循环创建线程
import threading,time,random
def fun(*args):
time.sleep(random.randint(1,4))
print("子线程",args)
if __name__ == "__main__":
start = time.time()
t_list= []
for x in range(10):
t1 = threading.Thread(target=fn,args=(x,))
t1.start()
t_list.append(t1)
#当前线程的名称
print(threading.current_thread().name)
#线程id
print(t.ident)
#线程是否正在执行
print(t.is_alive())
#正在运行线程的数量,包括主线程
print(threading.active_count())
#列举当前正在运行的所有的线程
print(threading.enumerate())
for t in t_list:
t.join()
print(time.time()-start)