Python中的并发编程

目录

一、引言

二、Python中的线程

1、线程的概念

2、创建线程

3、线程同步和锁

4、线程池

三、Python中的进程

1、进程的概念

2、创建进程

四、Python中的异步IO

1、异步IO的概念

2、异步IO的实现

3、异步IO的并发执行

五、总结


一、引言

并发编程是一种计算机编程模式,旨在利用多核处理器和发挥计算机系统的最大性能。在Python中,由于其解释型语言的特性,实现并发编程具有一定的挑战性。然而,Python提供了多种工具和库,使得并发编程变得相对容易。本文将深入探讨Python中的并发编程,包括线程、进程、异步IO等。

二、Python中的线程

1、线程的概念

线程是程序执行的基本单元,它包含程序执行的指令和所需的数据。在Python中,线程是轻量级的执行上下文,可以用于实现并发。

2、创建线程

在Python中,可以使用threading模块创建线程。下面是一个简单的示例:

import threading  
  
def worker():  
    print("This is a worker thread")  
  
t = threading.Thread(target=worker)  # 创建一个工作线程  
t.start()  # 启动线程

3、线程同步和锁

在多线程程序中,线程同步和锁是两个非常重要的概念。Python中的threading模块提供了多种同步原语,如锁(Lock)、条件(Condition)、信号量(Semaphore)等。下面是一个使用锁的示例:

import threading  
  
lock = threading.Lock()  # 创建一个锁对象  
  
def worker():  
    with lock:  # 使用锁对象上下文管理器来同步代码块  
        print("This is a worker thread")

4、线程池

在Python中,可以使用concurrent.futures模块创建线程池。下面是一个使用线程池的示例:

from concurrent.futures import ThreadPoolExecutor  
  
def worker():  
    print("This is a worker thread")  
  
with ThreadPoolExecutor(max_workers=5) as executor:  # 创建一个包含5个工作线程的线程池  
    for i in range(10):  # 将10个任务提交给线程池执行  
        executor.submit(worker)  # 异步执行worker函数

三、Python中的进程

1、进程的概念

进程是计算机中的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。在Python中,进程可以用于实现并发执行。每个进程都有自己的内存空间和系统资源。

2、创建进程

在Python中,可以使用multiprocessing模块创建进程。下面是一个简单的示例:

import multiprocessing  
  
def worker():  
    print("This is a worker process")  
  
p = multiprocessing.Process(target=worker)  # 创建一个工作进程  
p.start()  # 启动进程

四、Python中的异步IO

1、异步IO的概念

异步IO是一种编程模型,用于处理长时间运行的操作,如网络请求或文件I/O,而不会阻塞主线程。在Python中,异步IO通常使用asyncio模块实现。

2、异步IO的实现

在Python中,可以使用async和await关键字定义异步函数和异步代码块。下面是一个使用异步IO的示例:

import asyncio  
  
async def worker():  
    print("This is a worker coroutine")  
    await asyncio.sleep(1)  # 模拟一个耗时的操作  
  
async def main():  
    print("Starting main coroutine")  
    await worker()  # 异步执行worker函数  
    print("Finishing main coroutine")  
  
asyncio.run(main())  # 运行main函数,并等待其完成

在上面的示例中,worker函数是一个异步函数,它使用await关键字等待一个耗时的操作。main函数是另一个异步函数,它使用await关键字等待worker函数的完成。最后,使用asyncio.run()函数运行main函数。

3、异步IO的并发执行

在Python中,可以使用asyncio.gather()函数并发执行多个异步操作。下面是一个使用asyncio.gather()函数的示例:

import asyncio  
  
async def worker(n):  
    print(f"Worker {n} is running")  
    await asyncio.sleep(1)  # 模拟一个耗时的操作  
    print(f"Worker {n} is done")  
  
async def main():  
    workers = [worker(i) for i in range(5)]  # 创建5个工作协程  
    await asyncio.gather(*workers)  # 并发执行这5个工作协程  
  
asyncio.run(main())  # 运行main函数,并等待其完成

在上面的示例中,worker函数是一个异步函数,它模拟了一个耗时的操作。main函数创建了5个工作协程,并使用asyncio.gather()函数并发执行它们。

五、总结

Python中的并发编程提供了多种工具和库来处理多线程和多进程编程。线程是轻量级的执行上下文,适用于I/O密集型任务。进程是独立的程序实例,适用于CPU密集型任务。异步IO是一种非阻塞的编程模型,适用于处理长时间运行的操作。在实际应用中,可以根据不同的需求选择合适的并发模型来提高程序的性能和响应能力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

消息中间件——RabbitMQ(七)高级特性 2

前言 上一篇消息中间件——RabbitMQ(七)高级特性 1中我们介绍了消息如何保障100%的投递成功?,幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费的问题?,Confirm确认消息、Return返回消息。这篇我们…

LLM推理部署(四):一个用于训练、部署和评估基于大型语言模型的聊天机器人的开放平台FastChat

FastChat是用于对话机器人模型训练、部署、评估的开放平台。体验地址为:https://chat.lmsys.org/,该体验平台主要是为了收集人类的真实反馈,目前已经支持30多种大模型,已经收到500万的请求,收集了10万调人类对比大模型…

6-69.鸭子也是鸟

按要求完成下面的程序: 1、定义一个Bird类,包含一个void类型的无参的speak方法,输出“Jiu-Jiu-Jiu”。 2、定义一个Duck类,公有继承自Bird类,其成员包括: (1)私有string类型的成员na…

4个解决特定的任务的Pandas高效代码

在本文中,我将分享4个在一行代码中完成的Pandas操作。这些操作可以有效地解决特定的任务,并以一种好的方式给出结果。 从列表中创建字典 我有一份商品清单,我想看看它们的分布情况。更具体地说:希望得到唯一值以及它们在列表中出…

【高效开发工具系列】jackson入门使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

指针的综合运用第二期

1.指针数组 char *arr[5];//字符指针数组 int *arr[5];//整型指针数组 int ADD(int x,int y) { return xy; } int LOSE(int a,int b) { return a-b; } int *pa(int,int)ADD; int *pb(int,int)LOSE;//函数指针 int (*pc[2])(int,int){ADD,LOSE};//函数指针数组 //调用直接按数组…

VisionPro---PatMaxTool工具使用

CogPMAlignTool PatMax是一种图案位置搜索技术(识别定位),PatMax图案不依赖于像素格栅,是基于边缘特征的模板匹配而不是基于像素的模板匹配,支持图像中特征的旋转与缩放,边缘特征表示图像中不同区域间界限…

数据链路层之广域网、PPP协议、HDLC协议

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

内部培训平台的系统 PlayEdu搭建私有化内部培训平台

PlayEdu是由白书科技团队多年经营的线上教育系统,专为企业提供的全新企业培训方案 我们的目标是为更多的企业机构搭建私有化内部培训平台,以满足不断增长的培训需求 通过PlayEdu,企业可以有效地组织和管理培训资源,提供高质量的…

Leetcode—1423.可获得的最大点数【中等】

2023每日刷题&#xff08;四十八&#xff09; Leetcode—1423.可获得的最大点数 思路&#xff1a;逆向求长为 n−k 的连续子数组和的最小值 参考灵茶山艾府题解 实现代码 class Solution { public:int maxScore(vector<int>& cardPoints, int k) {int mins 0, …

nodejs基于vue的社区物业缴费报修管理系统7vwc6

运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架&#xff1a;Express/koa 前端:Vue.js 数据库&#xff1a;mysql 开发软件&#xff1a;VScode/webstorm/hbuiderx均可 数据库用MySQL,后台用vue框架 基本要求&#xff1a; 1. 对项目进行详细实际的需求分析。 2. 在网…

Java项目调用C/C++ SDK的方案汇总

Java项目调用C/C SDK的方案汇总 背景调研JNIJNativeJNAJavaCPP 背景 Java项目中需要调用到一个C项目&#xff0c;于是对目前通用的解决方案做了一些调研&#xff0c;这里做一个汇总。 调研 JNI JNI&#xff1a;Java Native Interface&#xff0c;JNI是一套编程接口&#xf…

某60区块链安全之Create2实战一学习记录

区块链安全 文章目录 区块链安全Create2实战一实验目的实验环境实验工具实验原理实验内容Create2实战一 实验步骤分析合约源代码漏洞Create2实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约Create2引发的漏洞及其利用 找到合约漏洞进行分析并形成利用 实…

基于SpringBoot + vue的在线视频教育平台

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

肖sir__mysql之视图__009

mysql之视图 一、什么是视图 视图是一个虚拟表&#xff08;逻辑表&#xff09;&#xff0c;它不在数据库中以存储形式保存&#xff08;本身包含数据&#xff09;&#xff0c;是在使用视图的时候动态生成。 二、视图作用 1、查询数据库中的非常复的数据 例如&#xff1a;多表&a…

微信支付/

微信支付准备工作 3.2.1 如何保证数据安全&#xff1f; 完成微信支付有两个关键的步骤&#xff1a; 第一个就是需要在商户系统当中调用微信后台的一个下单接口&#xff0c;就是生成预支付交易单。 第二个就是支付成功之后微信后台会给推送消息。 这两个接口数据的安全性&#x…

论文解读--Visual Lane Tracking and Prediction for Autonomous Vehicles

自动驾驶汽车视觉车道线跟踪和预测 摘要 我们提出了一种用于自动驾驶汽车跟踪水平道路车道标记位置的可视化方法。我们的方法是基于预测滤波的。预测步骤估计在每个新的图像帧中期望的车道标记位置。它也是基于汽车的运动学模型和嵌入式测程传感器产生的信息。使用适当准备的测…

区块链媒体:Web3.015个方法解析-华媒舍

Web3.0是第三代互联网的发展阶段&#xff0c;相较于Web2.0&#xff0c;它具有更高的可信性、安全性和去中心化特点。在Web3.0时代&#xff0c;推广变得更为重要&#xff0c;因为吸引用户和提高品牌知名度对于在竞争激烈的市场中脱颖而出至关重要。本文将揭秘推广Web3.0的15个秘…

Mysql安全之基础合规配置

一、背景 某次某平台进行安全性符合型评估时&#xff0c;列出了数据库相关安全选项&#xff0c;本文特对此记录&#xff0c;以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别&#xff1b; 1&#xff09;对登录Mysql系统用户的密码复杂度是否有要…

CSS3 修改滚动条样式

上图&#xff1a; 上代码&#xff1a; /* 修改垂直滚动条 */ .right-list::-webkit-scrollbar {width: 2px; /* 修改宽度 */height: 5px; /* 修改高度 */ } /* 修改滚动条轨道背景色 */ .right-list::-webkit-scrollbar-track {background-color: #f1f1f1; } /* 修改滚动条滑块…