您当前的位置:首页 > 计算机 > 编程开发 > Python

python精选23集(多线程)

时间:04-26来源:作者:点击数:

一.线程

1.1基本概念

①. 线程被称为轻量级的进程

②. 线程也可以使用计算机多核资源,是多任务编程方式

③. 线程是系统分配内核的最小单元

④. 线程可以理解为进程的分支任务

  • 线程与进程的理解图
    在这里插入图片描述

1.2基本特征

①. 一个进程中可以包含多个线程

②. 线程也是一个运行行为,消耗计算机资源

③. 一个进程中的所有线程共享这个进程的资源

④. 多个线程之间的运行互不影响各自运行

⑤. 线程的创建和销毁消耗资源远小于进程

⑥. 各个线程也有自己的ID等特征

1.3线程的创建

①.创建线程对象

from threading import Thread 

t = Thread()
功能:创建线程对象
参数:target 绑定线程函数
   args 元组 给线程函数位置传参
   kwargs 字典 给线程函数键值传参

②.启动线程

t.start()

③.回收线程

t.join([timeout])

Demo【线程】

from threading import Thread
from time import sleep
import os

# 线程函数
def game():
    for i in range(3):
        sleep(2)
        print(os.getpid(),"后裔:万箭齐发")

# 创建线程对象
t = Thread(target=game)
t.start() # 启动线程 执行game

for i in range(4):
    sleep(1)
    print(os.getpid(),"后裔:嗑药回血")

t.join() # 回收线程资源
在这里插入图片描述

Demo【线程传参】

from threading import Thread
from time import sleep
import os
# 含有参数的线程函数
def fun(sec,name):
    print("线程函数参数",os.getpid())
    sleep(sec)
    print("%s 线程完毕"%name)

# 创建多线程
jobs = []
for i in range(5):
    t = Thread(target=fun,args=(2,),kwargs={'name':"T%d"%i})
    jobs.append(t)
    t.start()

for i in jobs:
    i.join()
在这里插入图片描述

1.4线程对象属性

t.name 线程名称

t.setName() 设置线程名称

t.getName() 获取线程名称

t.is_alive() 查看线程是否在生命周期

t.daemon 设置主线程和分支线程的退出关系

t.setDaemon() 设置daemon属性值

t.isDaemon() 查看daemon属性值
  • daemon为True时主线程退出分支线程也退出。要在start前设置,通常不和join一起使用。

Demo【对象属性】

from threading import Thread
from time import sleep

def fun():
    sleep(3)
    print("线程属性测试")
    
t = Thread(target=fun, name="MyThread")

# 主线程退出分支线程也退出
t.setDaemon(True)
t.start()
t.setName("MyThread")

print("Name:", t.getName())  # 线程名称
print("Alive:", t.is_alive())  # 线程生命周期
print("is Daemon", t.isDaemon())
在这里插入图片描述

二.自定义线程

2.1创建步骤

①.继承Thread类

②. 重写__init__方法添加自己的属性,使用super加载父类属性

③.重写run方法

2.2使用方式

①.实例化对象

②.调用start自动执行run方法

③.调用join回收线程

Demo【线程】

from threading import Thread
from time import sleep, ctime
class MyThread(Thread):
def __init__(self, target=None,
                args=(), kwargs={}):
     super().__init__()
     self.target = target
     self.args = args
     self.kwargs = kwargs

def run(self):
     self.target(*self.args, **self.kwargs)
 # ***************************
 # 通过完成上面的MyThread使程序正常运行
 # 通过下面程序可以让player作为线程运行
 # player只是测试函数,名称和参数均不确定
 # ***************************
def player(sec, song):
   for i in range(3):
     print("Playing %s : %s" % (song, ctime()))
     sleep(sec)
 
 t = MyThread(target=player, args=(3,),
              kwargs={'song': '凉凉'})
 t.start()
 t.join()
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门