线程的创建与多线程

线程

线程创建的方式(一)

【使用此方式创建的线程为守护线程】

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)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值