Python进阶--线程-初解

Python进阶–线程-初解

1. 简介

线程是计算机运算时所能调度的最小单位,线程之上时进程,一个进程包含多个线程。如果把计算机想象成一个工厂,进程就是一个车间,一个车间生产一个产品(软件、软件的子程序…),线程就是车间工人,每个工人负责生产产品的一部分(程序的子任务)。

基于pyton3的threading模块进行探究。

通常将延时较大的子任务放入开辟的线程去运行,从而通过提高并发量提升执行效率。

2. 使用

每个线程执行一项具体任务、操作。

from threading import Thread

def worker():
    print("新线程已启动")

if __name__ == '__main__':
    print("主线程已启动")
    #1.生成线程对象
    th_obj= Thread(target=worker)
    #2.启动线程
    th_obj.start()
    
主线程已启动
新线程已启动

为任务worker开辟一个新线程(容器),主线程和新线程执行对应功能。

2.1 创建
#创建线程对象
class Therad:
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, *, daemon=None)
th_obj= Thread(target=worker)
  • target:可调用对象,即线程需要执行的任务
  • args,kwargs:参数target的参数
  • name:线程名
  • demo:bool型,守护标志位。

2.2 启动

th_obj.start()

启动后,线程挂在在线程队列上(线程较多时,cpu在线程队列上遍历线程、分时执行)。

2.3 生存状态

from threading import current_thread as cd, Thread, enumerate
import time

def worker():
    print('线程<%s >已启动' % cd().name)
    time.sleep(1)
    print('线程<%s >已关闭' % cd().name)

if __name__ == '__main__':
    obj_th = Thread(target= worker, name='线程一号')
    print(obj_th, obj_th.is_alive())
    obj_th.start()
    print(obj_th, obj_th.is_alive())
    time.sleep(3)
    print(obj_th, obj_th.is_alive())
    
<Thread(线程一号, initial)> False
<Thread(线程一号, started 140309028095744)> True
线程<线程一号 >已启动
线程<线程一号 >已关闭
<Thread(线程一号, stopped 140309028095744)> False

方法is_alive返回一个bool型数据,若线程对象正在运行(start方法执行后到线程结束前)返回True,反之返回False.

2.4 属性

线程对象的属性常用有ident, name, daemon

2.4.1 ident, name
from threading import Thread, current_thread as ct
import time

def worker():
    print("线程:%s 的id是:%d"%(ct().name, ct().ident))


if __name__ == '__main__':
    print("主线程已启动")
    #1.生成线程对象
    th_obj1= Thread(target=worker, name="线程一")
    #2.启动线程
    th_obj1.start()
    
主线程已启动
线程:线程一 的id是:139705775535872
  • 属性ident返回线程号
  • 属性name返回线程名(前提是要取名)
2.4.2 daemon

属性daemon意思是守护,其含义为daemon=True时,主线程不需要等待新线程结束后再结束(即将新线程放于后台运行)

例1:daemon = None

from threading import Thread, current_thread as ct
import time

def worker():
    print("线程:%s 已启动" % ct().name)
    time.sleep(2)             #做个延时,让新线程比主线程运行久
    print("线程:%s 的id是:%d" % (ct().name, ct().ident))


if __name__ == '__main__':
    print("主线程已启动")
    #1.生成线程对象
    th_obj1= Thread(target=worker, name="线程一") #daemon默认为None
    #2.启动线程
    th_obj1.start()
    # th_obj2.start()
    
主线程已启动
线程:线程一 已启动       #后面有延时
线程:线程一 的id是:140192825079552   #延时后打印

例2:daemon=False

from threading import Thread, current_thread as ct
import time

def worker():
    print("线程:%s 已启动" % ct().name)
    time.sleep(2)
    print("线程:%s 的id是:%d" % (ct().name, ct().ident))


if __name__ == '__main__':
    print("主线程已启动")
    #1.生成线程对象
    th_obj2= Thread(target=worker, name="线程一", daemon=False)
    #2.启动线程
    th_obj2.start()
    # th_obj2.start()
    
主线程已启动
线程:线程一 已启动   #有时候主线程运行太快,这句也不打印

daemon=True后,主线程与新线程的守护关系打开,不再依赖。主线程执行完自己的任务后,直接结束自己,不管新线程死活(新线程自立门户了)。

3 threading

threading模块由于多内置方法,用于便捷使用线程

3.1 current_thread

方法current_thread返回当前线程对象

from threading import current_thread as ct
if __name__ == '__main__':
    print(ct())
    
<_MainThread(MainThread, started 140049141180160)>

3.2 enumerate

方法enumerate返回处于运行状态的线程列表。

from threading import Thread, current_thread as ct, enumerate
import time

def worker1():
    print(enumerate())

if __name__ == '__main__':
    print("主线程已启动")
    #1.生成线程对象
    th_obj2= Thread(target=worker1, name="线程一")
    #2.启动线程
    th_obj2.start()
    
主线程已启动
[<_MainThread(MainThread, started 139767890433792)>, <Thread(线程一, started daemon 139767866418944)>]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值