Python多线程

第一章、多线程

一、概述

在Python中,进程和线程都是用于并发执行任务的概念,但它们在实现方式和作用上有所不同。

1、进程(Process)

        进程是指计算机中正在运行的程序的实例。每个进程都拥有自己独立的内存空间和系统资源,它们之间相互隔离,彼此独立运行每个进程都有自己的地址空间、文件描述符、环境变量等。

  • 进程是操作系统分配资源的基本单位,每个进程都有自己的内存空间、代码和数据。
  • 每个进程在独立的内存空间中运行,它们之间互相隔离,一个进程的崩溃通常不会影响其他进程。
  • 进程通常用于执行独立的任务,例如运行独立的应用程序或服务。
  • 在 Python 中,可以使用 multiprocessing 模块创建和管理多个进程。每个进程都有自己的 Python 解释器,因此可以充分利用多核处理器。

进程是一个应用程序(1个进程是一个软件)

2、线程(Thread)

        线程是在进程内部执行的独立单元,它是进程中的一个执行路径。一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。线程之间可以并发执行,共享数据,使得程序可以同时执行多个任务

  • 线程是进程内的执行单元,一个进程可以包含多个线程,它们共享同一进程的内存空间和资源。
  • 线程更轻量级,创建和销毁线程的开销较小,线程之间的切换速度较快。
  • 线程通常用于执行并发的任务,例如在图形用户界面 (GUI) 应用程序中处理用户输入、执行网络请求等。
  • 在 Python 中,可以使用内置的 threading 模块创建和管理线程。Python 中的全局解释器锁(Global Interpreter Lock,GIL)限制了多线程程序在多核处理器上的并行性,因此在 CPU 密集型任务中,多进程可能更适合。

线程是一个进程中的执行场景/执行单元。一个进程可以启动多个线程

对于java程序来说,当在DOS命令窗口中输入:

Python HelloWorld.py  回车之后

会先启动PVM,而PVM就是一个进程。

PVM再启动一个主线程

同时再启动一个垃圾回收线程负责看护,回收垃圾

最起码,现在的Python程序中至少有两个线程并发。一个是垃圾回收线程,一个是主线程

3、进程和线程的关系

阿里巴巴:进程

  • 马云:阿里巴巴的一个线程
  • 员工A:阿里巴巴的一个线程

京东:进程

  • 强东:京东的一个线程
  • 员工B:京东的一个线程

进程可以看做是现实生活中的公司;线程可以看作是公司当中的某个员工

注意:

进程A和进程B的内存独立不共享(阿里巴巴和京东资源不会共享)

线程A和线程B:

  • 假设启动10个线程,会有10个栈内存空间,每个栈和每个栈之间互不干扰,各自执行各自的,这就是多线程并发

Python 中之所以有多线程机制,目的就是为了提高程序的处理效率

4、线程与进程的主要区别如下:

  • 资源占用:进程之间相互独立,每个进程拥有自己的资源。而线程共享进程的资源,包括内存空间、文件等。
  • 执行单元:进程是一个程序的执行实例,有自己的独立执行环境。线程是进程内部的执行单元,可以并发执行多个线程。
  • 切换开销:线程切换的开销比进程切换要小,因为线程共享同一进程的资源,切换时只需保存和恢复线程的执行上下文。
  • 通信和同步:线程之间可以通过共享内存进行通信和数据交换,但也需要考虑线程同步和互斥的问题。进程之间通信相对复杂,需要使用特定的进程间通信机制。

        在Python中,多线程编程可以提高程序的并发性能和资源利用率,但也需要注意线程安全和同步的问题,避免出现竞态条件和数据一致性问题。

5、多进程与多线程

       需要注意的是,Python 的多线程在某些情况下由于 GIL 的存在,可能不会充分发挥多核处理器的性能优势,因此在一些情况下,多进程可以是更好的选择。但对于 I/O 密集型任务,多线程通常是一个有效的选择,因为线程可以在等待 I/O 操作完成时让出 CPU 资源。

        总之,Python 提供了多进程和多线程的支持,允许你以不同的方式实现并发编程,以满足不同类型任务的需求。选择使用进程还是线程取决于你的具体应用场景和性能需求。

二、实现多线程的方式

1、编写一个类,继承 threading.Thread

你可以创建一个自定义的线程类,继承自 threading.Thread 类,并重写 run 方法来定义线程的执行逻辑。

import threading

class MyThread(threading.Thread):
    def run(self):
        for i in range(1000):
            print("分支线程-->",i)

# 创建线程对象
my_thread = MyThread()

# 启动线程
my_thread.start()

for i in range(1000):
    print("主线程-->", i)

2、使用 threading 模块

Python 内置了 threading 模块,它提供了创建和管理线程的类和方法。这是 Python 中最常用的多线程编程方式。

import threading

# 定义一个线程函数
def my_function():
    for i in range(1000):
        print("分支线程-->",i)

# 创建线程对象
my_thread = threading.Thread(target=my_function)

# 启动线程
my_thread.start()

for i in range(1000):
    print("主线程-->", i)

你可能感兴趣的:(Python基础语法,python)