二十六、Python之线程编程(Thread)

线程基本概念

    1. 什么是线程

        【1】 线程被称为轻量级的进程

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

        【3】 线程是系统分配内核的最小单元

        【4】 线程可以理解为进程的分支任务

    2. 线程特征

        【1】 一个进程中可以包含多个线程

        【2】 线程也是一个运行行为,消耗计算机资源

        【3】 一个进程中的所有线程共享这个进程的资源

        【4】 多个线程之间的运行互不影响各自运行

        【5】 线程的创建和销毁消耗资源远小于进程

        【6】 各个线程也有自己的ID等特征

threading模块创建线程

    【1】 创建线程对象

from threading import Thread

t = Thread()

功能:创建线程对象

参数:target 绑定线程函数

           args 元组 给线程函数位置传参

           kwargs 字典 给线程函数键值传参

    【2】 启动线程

t.start()

    【3】 回收线程

t.join([timeout])

示例1:

"""
    线程示例
"""

import threading
from time import sleep
import os

a = 1


def music():
    global a
    print("子进程a:", a)  # a = 1
    a = 10000
    for i in range(5):
        sleep(2)
        print(os.getpid(), "播放心如止水", i)  # pid = 28512


# 子线程
t = threading.Thread(target=music)
t.start()

# 主线程任务
for i in range(3):
    sleep(3)
    print(os.getpid(), "跳舞吧")  # pid = 28512
t.join()

# 主线程获取到的a 已经被子线程更改为10000,同时和子线程拥有相同的进程PID
print("主线程a:", a)

示例2:

from threading import Thread
from time import sleep


# 含有参数的线程函数
def fun(sec, name):
    print("线程函数传参")
    sleep(sec)
    print("%s 线程执行完毕" % name)


jobs = []
for i in range(5):
    t = Thread(target=fun, args=(2, "t%d" % i))
    jobs.append(t)
    t.start()

for i in jobs:
    i.join()

线程对象属性

t.name 线程名称

t.setName() 设置线程名称

t.getName() 获取线程名称

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

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

t.setDaemon() 设置daemon属性值

t.isDaemon() 查看daemon属性值

daemon为True时主线程退出分支线程也退出。要在start前设置,通常不和join一起使用。

示例:

from threading import Thread
from time import sleep


def fun():
    sleep(3)
    print("属性测试")


# 线程名称,默认Thread-1,可以初始化时通过name参数自定义,或者初始化后再重新设置
t = Thread(target=fun, name="teen")
# 修改名称
# t.setName('teen')
print("Thread name:", t.getName())

# 一般主线程只是创建子线程,具体事物由子线程去执行,
# 所以子线程执行完,主进程也就结束了,当主线程结束时,只要daemon为True,子线程自动回收,不需要子线程调用join
t.setDaemon(True)
t.start()

# 线程生命周期,启动后为Tru,结束后或者未启动时为False
print("is alive:", t.is_alive())

自定义线程类

    1. 创建步骤

        【1】 继承Thread

        【2】 重写 __init__ 方法添加自己的属性,使用super()加载父类属性

        【3】 重写run()方法

    2. 使用方法

        【1】 实例化对象

        【2】 调用start() 自动执行run方法

        【3】 调用join() 回收线程

示例:

"""
    自定义线程类
"""
from threading import Thread
import time


class MyThread(Thread):
    def __init__(self, attr):
        super().__init__()
        self.attr = attr

    @staticmethod
    def fun1():
        print("步骤1")

    def fun2(self):
        self.fun1()
        print("步骤2")

    def fun3(self):
        self.fun2()
        print("步骤3")

    def run(self):
        self.fun3()
        time.sleep(3)
        print("完成")


if __name__ == '__main__':
    t = MyThread("参数")
    t.start()
    t.join()

多线程并发模型

示例:

from threading import Thread
from socket import *

HOST = '0.0.0.0'
PORT = 8888
ADDR = (HOST, PORT)

# 创建套接字
s = socket()
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(ADDR)
s.listen(3)


def handle(c):
    print("客户端:", c.getpeername())
    while True:
        data = c.recv(1024)
        if not data:
            break
        print(data.decode())
        c.send(b'OK')
    c.close()


# 监听客户端连接
while True:
    try:
        c, addr = s.accept()
    except Exception as e:
        print(e)
        continue

    # 接收到客户端连接,创建子线程去处理
    t = Thread(target=handle, args=(c,))
    t.setDaemon(True)  # 分支线程随主线程退出
    t.start()
发布了39 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chiaotien/article/details/104510543