【100天精通python】Day25:python的编程方式以及并发编程详解

news2024/11/15 12:28:49

 

目录

 专栏导读 

1 python的编程方式

2 顺序编程

3 面向对象编程

4 函数式编程

5 并发编程 

 5.1 多线程编程

threading模块常用用法

1 创建线程:

2 启动线程:

 3 等待线程执行完毕:

 4 获取当前活动线程数量:

5 获取当前线程对象:

 6 设置线程名字:

7 获取线程名字:

 8 设置守护线程(在主线程退出时自动退出):

9 线程同步 - 使用Lock:

 10 线程同步 - 使用Semaphore(信号量):

11 线程同步 - 使用Condition: 

12 线程间通信 - 使用Queue:

5.2 多进程编程

multiprocessing 模块常用用法 

 5.3 异步编程

 asyncio 模块常用用法


专栏导读 

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html

   

1 python的编程方式

       Python是一种高级编程语言,具有简洁易读的语法和丰富的标准库,广泛用于多个领域,包括Web开发、数据科学、人工智能、网络编程等。Python的编程方式可以概述如下:

  1. 脚本编程:Python适合用作脚本语言,能够快速编写并运行简单的脚本,处理各种任务,如文件操作、数据处理等。

  2. 面向对象编程:Python支持面向对象编程,可以创建类和对象,并通过继承、封装和多态等特性实现代码的模块化和重用。

  3. 函数式编程:Python支持函数式编程,可以将函数作为参数传递、返回函数,以及使用高阶函数等功能,方便实现函数的复合和抽象。

  4. 异步编程:Python提供asyncio模块,支持异步编程,允许在单线程中处理多个I/O任务,提高程序的并发性能。

  5. 并发编程:Python提供threadingmultiprocessing模块,允许通过多线程和多进程实现并发编程,充分利用多核CPU。

  6. 其他特性:Python还具有列表推导、生成器表达式、装饰器等特性,使得代码更加简洁、高效。

总体而言,Python的编程方式简单灵活,适合快速开发,适用于各种规模的项目,成为了许多开发者和科学家的首选语言。

2 顺序编程

        顺序编程是指按照代码的书写顺序依次执行程序,从上到下逐行执行代码。这是最简单、最基本的编程方式,适用于简单的任务和小规模的程序。

示例:

# 顺序编程示例
def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

x = 5
y = 10

result1 = add(x, y)
result2 = multiply(x, y)

print("Result of addition:", result1)
print("Result of multiplication:", result2)

3 面向对象编程

         面向对象编程是一种编程范式,通过创建类和对象来表示真实世界的事物和关系。在面向对象编程中,数据和功能被组织成对象,并通过类定义属性和方法。

示例:

# 面向对象编程示例
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def perimeter(self):
        return 2 * (self.width + self.height)

rect = Rectangle(5, 10)
print("Area:", rect.area())
print("Perimeter:", rect.perimeter())

4 函数式编程

         函数式编程是一种编程范式,将计算视为数学函数的应用,强调函数的纯粹性和不可变性。在函数式编程中,函数可以作为参数传递给其他函数,也可以返回其他函数。

示例:

# 函数式编程示例
def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

def apply_operation(operation, a, b):
    return operation(a, b)

x = 5
y = 10

result1 = apply_operation(add, x, y)
result2 = apply_operation(multiply, x, y)

print("Result of addition:", result1)
print("Result of multiplication:", result2)

5 并发编程 

        并发编程是指同时执行多个任务或处理多个操作的编程方式,它可以提高程序的执行效率和响应性。Python提供了多种并发编程的方式,包括多线程、多进程和异步编程。

 5.1 多线程编程

        多线程是一种并发编程的方式,它允许程序同时执行多个线程,每个线程处理一个独立的任务。Python的threading模块提供了多线程的支持。

示例:

import threading
import time

def print_numbers():
    for i in range(1, 6):
        print(i)
        time.sleep(1)

def print_letters():
    for letter in 'ABCDE':
        print(letter)
        time.sleep(1)

if __name__ == "__main__":
    # 创建两个线程
    thread1 = threading.Thread(target=print_numbers)
    thread2 = threading.Thread(target=print_letters)

    # 启动线程
    thread1.start()
    thread2.start()

    # 等待两个线程执行完成
    thread1.join()
    thread2.join()

    print("All threads have finished.")

        在上面的示例中,我们定义了两个函数print_numbersprint_letters,分别用于打印数字和字母。然后,我们创建了两个线程thread1thread2,并将这两个函数作为线程的执行目标。通过调用start方法启动线程,它们会并发执行。最后,我们使用join方法等待两个线程执行完成,然后输出"All threads have finished."。

        需要注意的是,由于Python的全局解释器锁(Global Interpreter Lock,GIL),多线程并不能发挥真正的并行执行能力,适合在IO密集型任务中使用,如网络请求、文件读写等。对于CPU密集型任务,建议使用多进程编程,即使用multiprocessing模块来实现。

threading模块常用用法

threading模块是Python中用于多线程编程的标准库,它提供了创建和管理线程的类和函数。 

1 创建线程:
import threading

def my_function():
    # 任务代码

my_thread = threading.Thread(target=my_function)
2 启动线程:
my_thread.start()
 3 等待线程执行完毕:
my_thread.join()
 4 获取当前活动线程数量:
threading.active_count()
5 获取当前线程对象:
threading.current_thread()
 6 设置线程名字:
my_thread = threading.Thread(target=my_function, name="MyThread")
7 获取线程名字:
my_thread.getName()
 8 设置守护线程(在主线程退出时自动退出):
my_thread.daemon = True
9 线程同步 - 使用Lock:
lock = threading.Lock()

def my_function():
    lock.acquire()
    # 临界区代码
    lock.release()
 10 线程同步 - 使用Semaphore(信号量):
semaphore = threading.Semaphore(2)  # 限制同时执行的线程数为2

def my_function():
    semaphore.acquire()
    # 临界区代码
    semaphore.release()
11 线程同步 - 使用Condition: 
condition = threading.Condition()

def producer():
    with condition:
        # 生产者代码
        condition.notify()  # 通知消费者

def consumer():
    with condition:
        condition.wait()  # 等待生产者通知
        # 消费者代码
12 线程间通信 - 使用Queue:
import queue

my_queue = queue.Queue()

def producer():
    my_queue.put("hello")

def consumer():
    data = my_queue.get()
    print(data)

 注意:由于Python中的全局解释器锁(GIL),多线程并不能发挥真正的并行执行能力。对于CPU密集型任务,建议使用多进程编程(multiprocessing模块)。对于IO密集型任务,多线程是一个不错的选择,可以在IO等待时切换到其他线程,提高程序的响应性。

5.2 多进程编程

         多进程是一种并发编程的方式,它允许程序同时执行多个进程,每个进程运行在独立的内存空间中。Python的multiprocessing模块提供了多进程的支持。

multiprocessing 模块常用用法 

  multiprocessing是Python标准库中用于实现多进程并发编程的模块。它提供了类似于threading模块的接口,但是可以在多个进程中并行执行任务,从而充分利用多核CPU的优势。以下是multiprocessing模块的一些常用用法:

  1. 创建进程:使用multiprocessing.Process类可以创建一个新的进程。

  2. 启动进程:调用进程对象的start()方法可以启动一个新的进程并开始执行任务。

  3. 进程间通信:使用multiprocessing.Queuemultiprocessing.Pipe等类来实现多个进程之间的通信。

  4. 进程池:使用multiprocessing.Pool类可以创建一个进程池,可以方便地进行进程复用和任务调度。

下面是一个简单的示例,演示了如何使用multiprocessing模块来实现多进程并发编程:

import multiprocessing
import time

def worker(name):
    print(f"Worker {name} started")
    time.sleep(2)
    print(f"Worker {name} finished")

if __name__ == "__main__":
    # 创建两个新进程
    p1 = multiprocessing.Process(target=worker, args=("A",))
    p2 = multiprocessing.Process(target=worker, args=("B",))

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

    # 等待两个进程结束
    p1.join()
    p2.join()

    print("All processes finished")

        在上面的示例中,我们定义了一个worker函数,用于模拟每个进程执行的任务。然后使用multiprocessing.Process类创建两个新的进程,并分别启动它们。最后,使用join()方法等待两个进程结束,并在所有进程完成后输出"All processes finished"。

        需要注意的是,在使用multiprocessing模块时,要确保主程序的代码放在if __name__ == "__main__":语句块中,以避免在子进程中重复执行主程序的代码。同时,multiprocessing模块在Windows系统下使用时,需要在if __name__ == "__main__":语句块中创建进程,以防止进程无限递归。

        在上面的示例代码中,我们没有涉及进程间通信和进程池的用法。下面我们将完善示例代码,包含进程间通信和进程池的使用:

import multiprocessing
import time

def worker(name, queue):
    print(f"Worker {name} started")
    time.sleep(2)
    queue.put(f"Result from worker {name}")

if __name__ == "__main__":
    # 创建进程间通信的队列
    queue = multiprocessing.Queue()

    # 创建进程池,池中有2个进程
    pool = multiprocessing.Pool(processes=2)

    # 启动进程池中的进程,每个进程执行worker函数
    pool.apply_async(worker, ("A", queue))
    pool.apply_async(worker, ("B", queue))

    # 关闭进程池,不再接受新的任务
    pool.close()

    # 等待所有进程完成
    pool.join()

    # 从队列中获取进程的结果
    results = []
    while not queue.empty():
        results.append(queue.get())

    print("All processes finished")
    print("Results:", results)

         在上面的示例代码中,我们使用multiprocessing.Queue实现了进程间的通信。每个子进程在完成任务后,会将结果放入队列中,主进程再从队列中获取这些结果。同时,我们使用multiprocessing.Pool创建了一个包含两个进程的进程池,并通过apply_async方法向进程池中提交任务。

        需要注意的是,进程池的大小可以根据系统的CPU核心数和任务的复杂度进行调整,以充分利用系统资源。

        以上示例代码展示了进程间通信和进程池的使用,使得多个进程可以并发执行任务,并在需要时进行通信。这样可以提高程序的效率和并发处理能力。

 5.3 异步编程

         异步编程是一种并发编程的方式,它允许程序在执行耗时操作时,不会阻塞其他任务的执行,从而提高程序的性能和响应性。在Python中,异步编程通常使用asyncio模块来实现。

        异步编程的关键是使用"async"和"await"关键字来定义异步函数和执行异步操作。异步函数可以通过"async def"关键字来定义,而在异步函数内部,可以使用"await"关键字来等待异步操作的完成。

import asyncio

async def foo():
    print("Start foo")
    await asyncio.sleep(2)
    print("End foo")

async def bar():
    print("Start bar")
    await asyncio.sleep(1)
    print("End bar")

# 创建一个事件循环
loop = asyncio.get_event_loop()

# 执行异步任务
loop.run_until_complete(asyncio.gather(foo(), bar()))

# 关闭事件循环
loop.close()

        在上面的示例中,我们定义了两个异步函数foobar,分别模拟了耗时的任务。在主程序中,我们使用asyncio.gather函数来同时运行这两个异步任务,并使用loop.run_until_complete来运行事件循环,直到所有异步任务完成。

        异步编程在处理IO密集型任务时特别有用,例如网络请求、文件读写等。通过使用异步编程,我们可以在等待IO操作的同时继续执行其他任务,从而提高程序的效率。

        需要注意的是,在异步编程中,不能在普通的同步函数内调用异步函数,而只能在其他异步函数内调用。另外,要确保所有的异步操作都是非阻塞的,否则可能会导致整个程序的阻塞。

        总的来说,异步编程是一种强大的并发编程方式,可以显著提高程序的性能和响应性。但它也需要仔细设计和考虑,以确保正确处理异步操作和避免潜在的并发问题。 

 asyncio 模块常用用法

   asyncio是Python标准库中提供的异步编程模块,用于编写异步代码和管理事件循环。它提供了一组用于定义异步函数和处理异步任务的工具。以下是asyncio模块的一些常用用法:

  1. 定义异步函数:使用async def关键字来定义异步函数,这些函数可以包含await关键字来等待异步操作的完成。

  2. 创建事件循环:使用asyncio.get_event_loop()来获取一个事件循环对象。

  3. 运行事件循环:使用loop.run_until_complete()来运行事件循环,直到指定的异步任务完成。

  4. 并发执行异步任务:使用asyncio.gather()函数可以同时运行多个异步任务,并等待它们全部完成。

  5. 异步IO操作:使用asyncio提供的异步IO函数,例如asyncio.open()asyncio.write(),来执行非阻塞的IO操作。

下面是一个简单的示例,演示了如何使用asyncio模块来并发执行异步任务:

import asyncio

async def foo():
    print("Start foo")
    await asyncio.sleep(2)
    print("End foo")

async def bar():
    print("Start bar")
    await asyncio.sleep(1)
    print("End bar")

async def main():
    # 并发执行foo和bar函数
    await asyncio.gather(foo(), bar())

# 创建一个事件循环
loop = asyncio.get_event_loop()

# 运行事件循环,直到main函数完成
loop.run_until_complete(main())

# 关闭事件循环
loop.close()

        在上面的示例中,我们定义了两个异步函数foobar,然后在main函数中使用asyncio.gather()函数同时运行这两个异步函数。最后,通过事件循环的run_until_complete()方法运行main函数,直到所有异步任务完成。

        需要注意的是,在使用asyncio进行异步编程时,要避免在同步代码中调用异步函数,否则可能会导致阻塞。尽量在异步环境中使用await关键字来等待异步操作的完成,以确保程序的高效性和响应性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/834326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elasticSearch常见的面试题

常见的面试问题 描述使用场景 es集群架构3个节点,根据不同的服务创建不同的索引,根据日期和环境,平均每天递增60*2,大约60Gb的数据。 调优技巧 原文参考:干货 | BAT等一线大厂 Elasticsearch面试题解读 - 掘金 设计阶…

Mac 安装不在 Apple 商店授权的应用程序

文章目录 一、场景介绍二、实操说明 一、场景介绍 在日常的工作生活中,发现一些好用的应用程序,但是出于某些原因,应用程序的开发者并没有将安装包上架到苹果商店。 那么这些优秀的应用程序下载安装以后就会出现如下弹框被拒之门外 二、实操…

【react】react生命周期钩子函数:

文章目录 一、生命周期概念:二、生命周期:三、挂载阶段(constructor > render > componentDidMount):四、更新阶段(render > componentDidUpdate):五、卸载阶段(componentWillUnmount …

基于STM32+微信小程序设计的个人健康助手(腾讯云IOT)

一、设计需求 1.1 项目背景 21世纪,社会高速发展,生活物质越来越丰富。为了追求更高的物质享受,人们不断消耗人体健康机制去拼搏,导致身体抵抗能力下降,引发各种疾病。因此,身体健康状况越来越备受大家的关注,健康意识也得到普遍提高。正常的体温是保障人体内部器官工…

【雕爷学编程】MicroPython动手做(36)——MixPY之Hello world 2

MixPY——让爱(AI)触手可及 主控芯片:K210(64位双核带硬件FPU和卷积加速器的 RISC-V CPU) 显示屏:LCD_2.8寸 320*240分辨率,支持电阻触摸 摄像头:OV2640,200W像素 扬声器:3W单…

Linux中提示No such file or directory解决方法

说明: 在linux下,./xxx.sh执行shell脚本时会提示No such file or directory。但shell明明存在,为什么就是会提示这个呢? 这种其实是因为编码方式不对,如你在win下编辑sh,然后直接复制到linux下面 实现&…

使用idea如何生成webservice客户端

需求阐述 在和外围系统对接的时候,对方只给了wsdl地址,记得之前了解到的webservice,可以用idea生成客户端代码。先记录生成的步骤 使用idea如何生成webservice客户端 1.创建一个Java项目 2.第二步生成代码 我的idea再右键要生成文件目录里…

使用 LangChain 搭建基于 Amazon DynamoDB 的大语言模型应用

LangChain 是一个旨在简化使用大型语言模型创建应用程序的框架。作为语言模型集成框架,在这个应用场景中,LangChain 将与 Amazon DynamoDB 紧密结合,构建一个完整的基于大语言模型的聊天应用。 本次活动,我们特意邀请了亚马逊云科…

stm32与上位机电脑间最快的通信方式是什么?

对于小型多关节机械臂的控制电路设计,选择合适的通信方式可以提高MCU与上位机之间的实时性。以下是一些在STM32上常用的通信方式,你可以根据你的具体需求选择适合的: 串口通信(UART):串口通信是一种常见的…

小米平板6将推14英寸版!与MIX Fold 3同步推出

今天,知名数码博主数码闲聊站爆料消息,称小米平板6将推出一款Max版本,预计与小米MIX Fold 3同步推出。 据介绍,小米平板6 Max将是小米首款14英寸大屏的旗舰平板,平板搭载骁龙8处理器,在性能释放、影音表现、…

硅谷AI启示录,中国式AI 避坑指南

点击关注 ​ 《AI未来指北》栏目由腾讯新闻推出,邀约全球业内专家、创业者、投资人,探讨AI领域的技术发展、商业模式、应用场景及治理挑战,本期聚焦硅谷近期AI投融资现状。 文丨郝 鑫 编丨苏扬、刘雨琦、王一粟 一扫去年裁员、股价暴跌的阴霾…

Spring和其IOC和DI

spring是干什么的? Spring 是一个开源的Java应用程序框架,最初由Rod Johnson在2003年创建。Spring 的初衷是为了简化企业级Java应用程序的开发,并提供一种灵活、可扩展、易于测试和维护的编程模型。 先来看看Spring 框架诞生的初衷&#xff…

如何从Pytorch中导出ONNX模型并使用它实现图像超分

前言 在本教程中,我们将介绍如何将 PyTorch 中定义的模型转换为 ONNX 格式,然后使用 ONNX 运行时运行它。 ONNX 运行时是面向 ONNX 模型的以性能为中心的引擎,可跨多个平台和硬件(Windows、Linux 和 Mac)以及 CPU 和 G…

Qlik Sense Desktop安装配置

Qlik Sense 是一种数据可视化分析的产品,允许从多个数据原进行数据读取并进行分析。而Qlik Sense Desktop作为桌面端的解决方案,为用户提供可视化创建、交互数据可视化、报告和仪表板等功能,目前只支持Windows系统。 注意:事先需要…

设计模式、Java8新特性实战 - List<T> 抽象统计组件

一、背景 在日常写代码的过程中,针对List集和,统计里面的某个属性,是经常的事情,针对List的某个属性的统计,我们目前大部分时候的代码都是这样写,每统计一个变量,就要定义一个值,且…

C++、python双语言弹窗教程与对比

Messagebox弹窗 MessageBox指的是显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。 例子: 本文介绍了用C、Pytho…

STM32基础入门学习笔记:核心板 电路原理与驱动编程

文章目录: 一:LED灯操作 1.LED灯的点亮和熄灭 延迟闪烁 main.c led.c led.h BitAction枚举 2.LED呼吸灯(灯的强弱交替变化) main.c delay.c 3.按键控制LED灯 key.h key.c main.c 二:FLASH读写程序(有…

数据安全能力框架模型-详细解读(二)

数据安全能力框架构成 1) 数据安全治理 管理视角:从组织制度流程上提出要求,由于数据在各业务系统之间流转,需要设立高级管理层参与决策的数据安全管理部门,统筹和规划多部门之间的工作;需要设立跨组织的…

34.利用matlab解 多变量多目标规划问题(matlab程序)

1.简述 学习目标:适合解 多变量多目标规划问题,例如 收益最大,风险最小 主要目标法,线性加权法,权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) ; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…

RabbitMQ 备份交换机和死信交换机

为处理生产者生产者将消息推送到交换机中,交换机按照消息中的路由键即自身策略无法将消息投递到指定队列中造成消息丢失的问题,可以使用备份交换机。 为处理在消息队列中到达TTL的过期消息,可采用死信交换机进行消息转存。 通过上述描述可知&…