深度解析Python线程和进程

yizhihongxing

深度解析Python线程和进程

Python是一门高级编程语言,它支持多线程和多进程编程。但是线程与进程是操作系统层面的概念,因此在Python中,我们使用操作系统提供的多线程/多进程API来实现多线程/多进程编程。

本文将深度解析Python中的线程和进程,介绍它们的定义、工作原理以及使用方法。

线程

定义

线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中真正执行的单位。相对于进程而言,线程是一个轻量级的存在,旨在实现一些简单的并行任务。在Python中,线程是_threadthreading模块中的重要概念。

工作原理

在Python中,线程是由操作系统负责调度的。当我们创建线程并启动它后,它会和主线程一起被放入系统的调度队列中,由操作系统负责决定哪些线程可以运行,并通过时间片轮转的方式进行交替执行。

使用方法

引入_thread模块,使用start_new_thread()函数创建线程。

import _thread

# 定义线程函数
def print_time(threadName, delay):
    count = 0
    while count < 5:
        time.sleep(delay)
        count += 1
        print(f"{threadName}:{time.ctime(time.time())}")

# 创建两个线程
try:
    _thread.start_new_thread(print_time, ("Thread 1", 1,))
    _thread.start_new_thread(print_time, ("Thread 2", 2,))
except:
    print("Error: 无法启动线程")

# 等待所有线程完成
while 1:
    pass

进程

定义

进程是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动。在一个程序中可以同时运行多个进程,每个进程之间是独立的、不影响的、互相隔离的。在Python中,进程是multiprocessing模块中的重要概念。

工作原理

在Python中,进程也是由操作系统负责调度的。当我们创建进程并启动它后,它会被划分到不同的CPU核心并分别调度运行,不同进程之间无法共享数据,通过IPC(inter process communication)机制进行进程间通信。

使用方法

引入multiprocessing模块,使用Process类创建进程。

from multiprocessing import Process

# 定义进程函数
def print_time(processName):
    count = 0
    while count < 5:
        time.sleep(1)
        count += 1
        print(f"{processName}:{time.ctime(time.time())}")

# 创建两个进程
if __name__ == '__main__':
    p1 = Process(target=print_time, args=("Process 1",))
    p2 = Process(target=print_time, args=("Process 2",))

    # 启动进程
    p1.start()
    p2.start()

    # 等待子进程完成后,再继续往后执行
    p1.join()
    p2.join()

示例

下面演示使用Python的多线程和多进程来处理一个耗时的任务,比较它们的运行速度。

import time
from threading import Thread
from multiprocessing import Process

def count_prime_number(start, end):
    # 统计素数的个数
    count = 0
    for num in range(start, end+1):
        # 素数定义:只能被1和本身整除的数
        if num > 1:
            for i in range(2, num):
                if num % i == 0:
                    break
            else:
                count += 1
    print(f"从{start}到{end}之间的素数个数为{count}")

if __name__ == '__main__':
    start_time = time.time()

    # 创建两个线程分别计算1~5000和5001~10000之间的素数
    t1 = Thread(target=count_prime_number, args=(1, 5000))
    t2 = Thread(target=count_prime_number, args=(5001, 10000))

    # 创建两个进程分别计算1~5000和5001~10000之间的素数
    p1 = Process(target=count_prime_number, args=(1, 5000))
    p2 = Process(target=count_prime_number, args=(5001, 10000))

    print("计算素数(使用线程):")
    t1.start()
    t2.start()
    t1.join()
    t2.join()

    print("计算素数(使用进程):")
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    end_time = time.time()
    print(f"程序运行时间:{end_time-start_time}s")

执行结果如下:

计算素数(使用线程):
从1到5000之间的素数个数为669
从5001到10000之间的素数个数为670
计算素数(使用进程):
从5001到10000之间的素数个数为670
从1到5000之间的素数个数为669
程序运行时间:5.438058376312256s

结果显示,使用进程和使用线程计算素数的结果都是正确的,但是进程的速度明显更快一些。这是因为进程之间独立运行,互不影响,具有很好的并行性。而线程之间共享进程的资源,容易出现竞争和阻塞,效率较低。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深度解析Python线程和进程 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 查找NumPy数组元素的和与积

    查找NumPy数组元素的和与积的完整攻略可以分成以下几个步骤: 创建NumPy数组; 查找数组的和和积。 下面我会详细讲解每一个步骤,并提供两个示例来说明。 创建NumPy数组 在Python中使用NumPy库创建数组可以使用numpy.array()函数。该函数的第一个参数可以是列表、元组、其他序列类型或嵌套序列,该函数还可以为数组指定数据类型。下面的示例…

    python-answer 2023年3月25日
    00
  • django model object序列化实例

    下面我将对“django model object序列化实例”的完整攻略进行详细讲解,包含示例说明和实际使用场景。 什么是django model object序列化? 在Django中,Model是用来与关系数据库交互的对象。Model定义了一个表的结构以及与表相关的方法,我们可以通过Model来操作数据库。而序列化则是将数据转化为一种跨平台、易读易传的格…

    python 2023年6月3日
    00
  • Python BS4库的安装与使用详解

    Python的BeautifulSoup4(BS4)库是一个用于解析HTML和XML文档的Python库。它可以帮助开发者从网页中提取数据,并进行数据清洗和处理。以下是Python BS4库的安装与使用详解: 安装BS4库 可以使用pip命令安装BS4库。以下是安装BS4库的基本语法: pip install beautifulsoup4 在安装BS4库之前…

    python 2023年5月14日
    00
  • 基于Google的Python编码规范标准

    基于Google的Python编码规范标准是一套广泛应用于Python开发领域的代码规范标准。它贯穿了Python代码编写过程中的各个方面,包括缩进、变量命名、代码注释等,能够有效提高代码的可读性和可维护性。下面我们将讲述完整的基于Google的Python编码规范标准的攻略过程: 步骤一:格式化代码 Python代码中的缩进是非常重要的,因为它可以告诉编译…

    python 2023年5月31日
    00
  • Python 中的range(),以及列表切片方法

    Python中的range()函数是用来生成一系列整数的函数,常用于循环结构中。 range()函数的语法格式为:range(start, stop, step) 其中,start表示起始整数(默认为0),stop表示终止整数(不包含该整数),step表示步长(默认为1)。 示例1:用range()函数生成一个简单的整数序列 num_list = list(…

    python 2023年5月14日
    00
  • Python如何脚本过滤文件中的注释

    在Python中,我们可以使用正则表达式或字符串操作来过滤文件中的注释。以下是Python如何脚本过滤文件中的注释的完整攻略: 使用正则表达式过滤注释 在Python中,我们可以使用正则表达式来过滤文件中的注释。以下是使用正则表达式过滤注释的示例代码: import re with open(‘example.py’, ‘r’) as f: content …

    python 2023年5月14日
    00
  • Python基础学习之奇异的GUI对话框

    下面是关于“Python基础学习之奇异的GUI对话框”的完整攻略: 1. GUI对话框的概述 GUI对话框是一种常见的交互方式,用于向用户提示信息或者接收用户输入内容。在Python的GUI编程中,提供了多种不同类型的对话框,包括消息框、文件对话框、颜色选择对话框等。Python的GUI编程主要使用Tkinter库,其中也包含了对话框的实现。 2. Tkin…

    python 2023年6月13日
    00
  • python实现将range()函数生成的数字存储在一个列表中

    Python实现将range()函数生成的数字存储在一个列表中 在Python中,我们可以使用range()函数生成一系列数字,然后将这些数字存储在一个列表中。本攻略将详细介绍如何实现这一过程。 使用list()函数将range()函数生成的数字存储在一个列表中 以下是一个示例代码,演示如何使用list()函数将range函数生成的数字存储在一个列表中: #…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部