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是一种非阻塞的编程模型,适用于处理长时间运行的操作。在实际应用中,可以根据不同的需求选择合适的并发模型来提高程序的性能和响应能力。

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

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

相关文章

【漏洞复现】智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC

漏洞描述 智跃人力资源管理系统是基于B/S网页端广域网平台,一套考勤系统即可对全国各地多个分公司进行统一管控,成本更低。信息共享更快。跨平台,跨电子设备。智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在SQL注入漏洞,攻击者可通过该漏洞获取数据库中的信…

100W用户、8000W流量在线贺卡应用架构如何优化?

文章目录 🔊博主介绍🥤本文内容📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

数据管理系统-week10-自由访问控制

文章目录 前言一、用户管理用户管理语句介绍二、数据库管理三、特权(重点考点)Administrative (global) privileges数据库特权表权限列权限四、角色参考文献前言 这节课主要讲了用户管理数据库的具体语句,数据库特权当中的全局特权,数据库特权,表特权与列特权的使用与注意…

GOLAND搭建GIN框架以及基础框架搭建

创建GO环境文件夹 终端输入安装GIN go get -u github.com/gin-gonic/gin如果遇到超时错误 package golang.org/x/net/html: unrecognized import path "golang.org/x/net/html": https fetch: Get "https://golang.org/x/net/html?go-get1": dial tcp …

KubeShark: Kubernetes的Wireshark

Wireshark可以帮助我们抓取并分析网络数据包,理解网络中发生的事情,那是否有工具可以帮助我们理解在K8S集群中发生的事情,帮助排查集群故障,Kubeshark就是这样的工具。原文: KubeShark: Wireshark for Kubernetes[1] 简介 Wiresha…

【动态代理详解】

动态代理 知道什么是动态代理以及动态代理能干什么就可以 代理的概述 什么是动态代理 ​ 使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理&…

GnuCash macos 设置中文的方法

一、环境: macos 13.6.1 gnucash 5.4-2 二、查看系统默认语言: defaults read -g AppleLocale 三、设置gnucash应用语言: defaults write $(mdls -name kMDItemCFBundleIdentifier -raw /Applications/GnuCash.app) AppleLanguages "…

【Oracle】数据库登陆错误:ORA-28000:the account is locked解决方法

问题描述 在连接Oracle数据库的时候出现了ORA-28000:the account is locked报错,登录账号被锁定,出现这种情况就需要将被锁定用户解锁。 解决方法 解锁方法就是通过用system账号登录数据库,然后修改被锁定账户状态,具体如下图所示…

LINQ-123 题外篇之IEnumerable和IQueryable

这两天又学习了2篇&#xff0c;记录下&#xff1a; IEnumerable and IQueryable in C# - Dot Net Tutorials Differences Between IEnumerable and IQueryable in C# - Dot Net Tutorials 实现接口IEnumerable和IQueryable是使用LINQ查询的必要条件。 关于 IEnumerable<…

51爱心流水灯32灯炫酷代码

源代码摘自远眺883的文章&#xff0c;大佬是30个灯的&#xff0c;感兴趣的铁汁们可以去看看哦~&#xff08;已取得原作者的许可&#xff09;&#xff1a;基于STC89C51单片机设计的心形流水灯软件代码部分_单片机流水灯代码_远眺883的博客-CSDN博客 由于博主是个小菜鸡&#xff…

SSM+VUE的增删改查

目录 后端代码 mapper.xml controller 前端代码 api》action.js 后端代码 mapper.xml <!--模糊查询--><select id"selectLike" parameterType"com.zking.spboot.model.Book" resultMap"BaseResultMap">select * from t_book&l…

selenium+python

selenium 八大查找元素 from selenium import webdriver from selenium.webdriver.common.by import By# 创建一个 WebDriver 实例 driver webdriver.Chrome()# 打开网页 driver.get("https://www.baidu.com/")# 使用 find_element 方法查找元素 element driver.…

springboot 整合 Spring Security 上篇

1.创建springBoot 项目工程(spring6.0的底层、JDK17) 1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>配置完成启动访问controller会出现登录…

prometheus部署及与grafana结合应用

一、prometheus 介绍 prometheus server 是 Prometheus组件中的核心部分&#xff0c;负责实现对监控数据的获取&#xff0c;存储以及查询。它会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据&#xff0c;当新拉取到的数据大于配置的内存缓存区时&…

【数据结构和算法】无限集中的最小数字

其他系列文章导航 Java基础合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 三、代码 四、总结 前言 这是力扣的2336题&#xff0c;难度为中等&#xff0c;解题方案有很多种&#xff0c;本文讲解我认为…

绘制彩色正多边形-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第10讲。 绘制彩色正多边形…

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

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

弱网模拟工具

一、背景 一个人晚上在家通过 Wi-Fi 上网&#xff0c;在线电影播放基本流畅&#xff0c;可一旦在晚间用网高峰期打视频电话就画面糊&#xff0c;这时不仅可能带宽受限了&#xff0c;还可能有较高的丢包率。与有线网络通信相比&#xff0c;无线网络通信受环境影响会更大&#x…

【Java Web学习笔记】 1 - HTML入门

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/html 零、网页的组成 HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息&#xff0c;可以包含文字、图片视频等。 CSS样式是表现。就像网页的外衣。比如&#xff0c;标题字体、…

类,封装,包

类&#xff0c;封装&#xff0c;包 一级目录1&#xff1a;下面代码的运行结果是&#xff08;&#xff09;2&#xff1a;以下哪项说法是正确的&#xff1f;3&#xff1a;以下代码在编译和运行过程中会出现什么情况4&#xff1a;在JAVA中&#xff0c;假设A有构造方法A(int a)&…