16_Python基础_Python多线程

本文详细介绍了Python中的多线程技术,包括进程与线程的基本概念、threading模块的使用、如何创建和管理线程,以及实例展示了线程的创建与控制,包括线程的启动、休眠和停止。通过自定义函数和自定义线程类两种方式实现线程体,并通过一个图片下载的例子展示了如何在控制线程中停止工作线程。
Python多线程
    当我们想让程序同时执行多个任务,则需要使用到多线程技术。
    一、线程知识简介
        进程
           一个进程指的是一个正在执行的程序,每一个进程都有自己独立的一块内存空间,一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的。
            在Windows操作系统中,一个进程就是一个exe或dll程序,它们相互独立,相互可以通信。
        线程
            在一个进程中可以包含多个线程,多线程共享一块内存空间和一组系统资源。所以,系统在各个线程之间进行切换时,开销要比进程小得多,正因如此,线程被称为轻量级的进程。
        主线程
            Python的程序中至少要有一个线程,这个就是主线程,程序在启动后由python解释器负责创建主线程,在程序结束后由Python解释器负责停止主线程。
            在多线程中,主线程负责其它线程的启动、挂起、停止等操作。主线程外的其它线程称为子线程。
    二、线程模块--threading
        Python官方提供的threading模块可以进行多线程的编程。
        threading模块中提供了线程类Thread,还提供了相关的线程操作的函数,其中常用的函数如下
            active_count()    返回当前处于活动状态的线程个数
            current_thread()    返回主当前Thread对象
            main_thread()    返回主线程对象。主线程是Python解释器启动的线程
            
        
    三、创建子线程
        要创建一个可执行的子线程,需要有两个要素
            1、线程对象:线程对象是threading模块的线程类Thread和Thread子类所创建的对象
            2、线程体:线程体是子线程要执行的代码,这些代码会被 封装到一个函数中。子线程在启动后会执行线程体,实现线程体主要有两种方式
                自定义函数实体线程体
                自定义线程类实现线程体
        自定义函数实现线程体
            创建线程Thread对象的构造方法如下:
Thread(target=None,name=None,args=())
    target参数:指向线程体函数,这个就是我们可以自定义的线程体函数
    name参数:设置线程名称,如果没有指定这个参数则系统会分配一个名称
    args参数:它是一个元组,为线程体函数提供的参数
# coding=utf-8
import threading
import time
# 定义线程体函数
def thread_body():
    # 当前线程对象
    t = threading.current_thread()
    for n in range(5):
        # 当前线程名
        print("第{0}次执行线程【{1}】".format(n,t.name))
        # 线程休眠
        time.sleep(2)
    print('线程【{0}】执行完成!'.format(t.name))
# 创建一个线程对象t1
t1 = threading.Thread(target=thread_body)
# 创建一个线程对象t2
t2 = threading.Thread(target=thread_body,name='线程t2')
# 启动线程t1、t2
t1.start()
t2.start()
    在自定义的线程体函数中我们做了线程的休眠time.sleep(2),线程进来执行的时候会休眠两秒钟,这样创建的两个线程可以看到是交错执行的,如果我们把这个休眠除掉,则基本上会是t1执行完后再执行t2。
        自定义线程类实现线程体
            自定义线和类实现线程体的方式是创建一个Thread子类并重写它的run()方法,这里的run()方法就是它的线程体函数。
# coding=utf-8
import threading
import time
class MyThread(threading.Thread):
    def __init__(self,name=None):
        super().__init__(name=name)
    # 重写run方法,线程体函数
    def run(self):
        # 当前线程对象
        t = threading.current_thread()
        for n in range(5):
            # 当前线程名
            print("第{0}次执行线程【{1}】".format(n,t.name))
            # 线程休眠
            time.sleep(2)
        print('线程【{0}】执行完成'.format(t.name))
# 创建线程对象t1
t1 = MyThread()
# 创建线程对象t2
t2 = MyThread(name='线程t2')
# 启动线程t1,t2
t1.start()
t2.start()
    四、线程管理
        线程管理包括线程创建、线程启动、线程休眠、等待线程结束和线程停止。
        等待线程结束
            有时候一个线程需要等待另外一个线程执行结束后才能继续执行。
            join()方法的语法如下:
                join(timeout=None)
                    参数 timeout用于设置超时时间,单位是秒。如果没有设置timeout,则可以一直等待,直到结束。
            
        
            线程停止
                在线程体结束时,线程就停止了,在某些较为复杂的业务场景中,会在线程体中执行一个"死循环"。线程体是否继续执行"死循环"是通过判断停止变量实现的,当”死循环“结束则线程体结束,那么线程也就结束了。
                在一般情况下,死循环会执行线程任务,然后休眠,再执行,再休眠,直到结束循环
            
        图片下载(子线程循环进行,至到控制线程输入exit)
# coding=utf-8
import threading
import time
import urllib.request
import os
# 线程停止变量
isrun = True
# 工程线程体函数
def workthread_body():
    while isrun:
        # 线程开始工作
        print("工作线程执行下载……")
        download() # 进行下载操作
        # 线程休眠
        time.sleep(5)
    print("工作线程停止工作")
# 控制线程函数体
def controlthread_body():
    global isrun
    while isrun:
        # 从键盘输入停止指令
        command = input("请输入停止指令:")
        if command == 'exit':
            isrun = False
            print('控制线程结束。')
def download():
    url = r'https://pic.ntimg.cn/20131008/7447430_112059179000_2.jpg'
    req = urllib.request.Request(url)
    with urllib.request.urlopen(req) as response:
        data = response.read()
        f_name = 'images/download' + str(int(time.time())) + '.jpg'
        with open(f_name,'wb') as f:
            f.write(data)
            print("图片下载成功")
# 判断目录是否存在,不存在则创建这么一个目录
if os.path.exists("image") == False:
    os.mkdir("images")
# 工作线程
workthread = threading.Thread(target=workthread_body)
workthread.start()
# 控制线程
controlthread = threading.Thread(target=controlthread_body)
controlthread.start()
### 回答1: 很抱歉,我之前回答的还是这个问题。以下是一个稍微复杂一点的 Python 多线程实例,可以用来计算一个矩阵的乘积: ```python import threading import numpy as np # 定义矩阵的大小 MATRIX_SIZE = 1000 # 初始化两个随机矩阵 matrix_a = np.random.rand(MATRIX_SIZE, MATRIX_SIZE) matrix_b = np.random.rand(MATRIX_SIZE, MATRIX_SIZE) # 初始化结果矩阵 result_matrix = np.zeros((MATRIX_SIZE, MATRIX_SIZE)) # 定义一个函数,用来计算矩阵的乘积 def multiply(start, end): for i in range(start, end): for j in range(MATRIX_SIZE): for k in range(MATRIX_SIZE): result_matrix[i][j] += matrix_a[i][k] * matrix_b[k][j] # 定义线程数量 NUM_THREADS = 4 # 计算每个线程需要计算的行数 rows_per_thread = MATRIX_SIZE // NUM_THREADS # 创建线程列表 threads = [] # 启动线程 for i in range(NUM_THREADS): start = i * rows_per_thread end = (i + 1) * rows_per_thread t = threading.Thread(target=multiply, args=(start, end)) threads.append(t) t.start() # 等待所有线程结束 for t in threads: t.join() # 检查结果是否正确 expected_result = np.dot(matrix_a, matrix_b) assert np.array_equal(result_matrix, expected_result) # 输出 Done 表示程序执行完毕 print("Done") ``` 这个例子首先初始化两个随机矩阵,然后定义一个函数 multiply,用来计算这两个矩阵的乘积。然后,它将矩阵分成若干个部分,每个部分分配给一个线程来计算。最后,它等待所有线程结束,检查结果是否正确,并输出 Done 表示程序执行完毕。 希望这个例子能够帮助您更好地理解 Python 多线程的使用方法。 ### 回答2: Python多线程实例是指在Python编程语言中使用多线程进行并发编程的实例。在Python中,可以使用内置的threading模块来创建和管理多线程。 通过创建多线程,可以在程序中同时执行多个任务。这对于需要同时处理多个任务的情况非常有用。例如,在下载大文件时,可以使用多线程同时下载多个文件,加快下载速度。此外,多线程还可以用于处理网络请求、图像处理、数据处理等耗时操作,提高程序的运行效率。 使用Python多线程的主要步骤如下: 1. 导入threading模块。 ``` import threading ``` 2. 创建一个线程对象,可以通过继承threading.Thread或使用threading.Thread()函数创建。 ``` class MyThread(threading.Thread): def __init__(self, name): super().__init__() self.name = name def run(self): # 线程执行的代码 print("Hello, " + self.name) thread1 = MyThread("Thread 1") thread2 = threading.Thread(target=func, args=("Thread 2",)) ``` 3. 启动线程。 ``` thread1.start() thread2.start() ``` 4. 等待线程结束。 ``` thread1.join() thread2.join() ``` 以上代码演示了两种创建多线程的方法:1)继承threading.Thread,重写run方法;2)使用函数作为线程的执行内容。线程的启动调用start()方法,等待线程结束使用join()方法。 需要注意的是,Python多线程的并发程度受到全局解释器锁(GIL)的限制,因此对于计算密集型的任务,多线程并不能发挥出多核的优势。如果需要发挥多核性能,可以考虑使用多进程编程。 总之,Python多线程实例能够提高程序的并发处理能力,适用于需要同时处理多个任务的场景。通过合理设计线程的数量和任务分配,可以提高程序的性能和效率。 ### 回答3: Python多线程实例是指通过使用多线程的技术来提高Python程序的运行效率和性能。在Python中,我们可以使用threading模块来实现多线程多线程技术可以同时执行多个任务,提高程序的运行速度。在Python中,我们可以通过创建Thread对象并调用start()方法来启动一个线程。下面是一个简单的例子: import threading def print_numbers(): for i in range(1, 11): print(i) def print_letters(): for letter in ['A', 'B', 'C', 'D', 'E']: print(letter) # 创建两个线程 t1 = threading.Thread(target=print_numbers) t2 = threading.Thread(target=print_letters) # 启动两个线程 t1.start() t2.start() # 等待两个线程结束 t1.join() t2.join() # 主线程继续执行 print("主线程结束") 以上代码中,我们创建了两个线程,分别执行print_numbers()和print_letters()函数。通过调用start()方法启动线程,并通过join()方法等待两个线程执行完毕。最后,主线程继续执行并打印出一段文字。 需要注意的是,多线程并不一定能提高程序的运行速度,因为在Python中,全局解释器锁(Global Interpreter Lock,GIL)会限制同一时间只能有一个线程执行Python字节码。因此,在CPU密集型任务中,多线程并不能真正实现并行计算。但是,在IO密集型任务中,多线程能够提高程序的运行效率。 总结起来,Python多线程实例可以通过使用threading模块来实现。多线程能够提高IO密集型任务的运行效率,但在CPU密集型任务中并不能真正实现并行计算。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值