异步与并发基础:同步、异步、并发、并行简介

在计算机程序设计中,同步异步并发并行是描述任务执行和调度的不同方式。这些概念对于理解如何提高程序的执行效率和响应速度非常重要。下面将逐一解释这些概念。


1. 同步(Synchronous)

同步是指在执行任务时,当前任务必须完成才能执行下一个任务,任务之间是顺序执行的。同步操作通常会阻塞程序的执行,直到当前任务完成。

  • 特点

    • 按顺序执行任务。
    • 每个任务的执行需要等待前一个任务完成。
    • 线程或进程会被阻塞,直到任务完成。
  • 例子

    • 假设你正在执行一个任务,例如从文件读取数据。同步执行意味着你必须等到文件读取完成后,才能执行后续的操作。
def task1():
    print("开始任务1")
    # 模拟执行任务
    time.sleep(2)
    print("任务1完成")

def task2():
    print("开始任务2")
    time.sleep(1)
    print("任务2完成")

task1()
task2()

在这个例子中,task2 需要等到 task1 完成后才会开始执行。


2. 异步(Asynchronous)

异步是指程序可以在等待某个任务完成时,去执行其他任务,任务的执行是非阻塞的。也就是说,当一个任务需要等待某些外部操作(如 I/O 操作)时,它不会阻塞整个程序的执行,而是将控制权交还给事件循环,继续执行其他任务。

  • 特点

    • 任务不需要按顺序执行,能够在等待某些任务完成时执行其他任务。
    • 异步编程通常涉及事件循环和回调函数。
    • 不阻塞线程,可以有效提高程序的响应性,尤其是在处理 I/O 操作时。
  • 例子(使用 asyncio 库):

import asyncio

async def task1():
    print("开始任务1")
    await asyncio.sleep(2)  # 模拟异步操作
    print("任务1完成")

async def task2():
    print("开始任务2")
    await asyncio.sleep(1)
    print("任务2完成")

async def main():
    # 异步执行任务1和任务2
    await asyncio.gather(task1(), task2())

# 运行异步任务
asyncio.run(main())

在这个例子中,task2 会在 task1 等待时执行,从而实现非阻塞执行。


3. 并发(Concurrency)

并发是指程序能够同时管理多个任务的执行。并发可以通过多线程、多进程或者异步方式实现。在并发中,虽然任务并不一定是同时执行的,但它们是交替执行的,任务之间通过切换执行,可能会在同一时刻处理多个任务。

  • 特点

    • 在并发程序中,多个任务会交替执行,看似同时进行。
    • 可以通过线程、进程或异步方式实现。
    • 并发的重点是任务管理和调度,而不是任务的实际同时执行。
  • 例子

    • 使用多线程处理 I/O 密集型任务。
    • 在 Web 服务器中,处理多个请求(虽然每个请求不是同时处理,但通过切换任务,多个请求被并发处理)。
import threading
import time

def task1():
    print("开始任务1")
    time.sleep(2)
    print("任务1完成")

def task2():
    print("开始任务2")
    time.sleep(1)
    print("任务2完成")

# 创建线程
thread1 = threading.Thread(target=task1)
thread2 = threading.Thread(target=task2)

thread1.start()
thread2.start()

thread1.join()
thread2.join()

在这个例子中,任务 task1task2 会并发执行,程序不会等待一个任务完成才执行下一个任务。


4. 并行(Parallelism)

并行是指任务在多个处理器核心上同时执行。并行强调的是同时执行多个任务,每个任务都在独立的处理器核心上运行,能够充分利用多核 CPU 资源,从而显著提高程序的执行效率。

  • 特点

    • 任务实际上是同时执行的。
    • 并行通常需要多个 CPU 核心或多个处理器。
    • 并行主要用于计算密集型任务。
  • 例子

    • 使用多进程处理 CPU 密集型任务,充分利用多核 CPU。
import multiprocessing
import time

def task1():
    print("开始任务1")
    time.sleep(2)
    print("任务1完成")

def task2():
    print("开始任务2")
    time.sleep(1)
    print("任务2完成")

if __name__ == '__main__':
    # 创建进程
    process1 = multiprocessing.Process(target=task1)
    process2 = multiprocessing.Process(target=task2)

    process1.start()
    process2.start()

    process1.join()
    process2.join()

在这个例子中,task1task2 会在不同的进程中并行执行。


总结:同步 vs 异步 vs 并发 vs 并行

特性同步异步并发并行
执行方式按顺序执行,任务阻塞非阻塞,任务交替执行多个任务交替执行多个任务同时执行
资源使用只使用一个线程/进程使用一个线程/进程使用多个线程/进程使用多个核心/处理器
适用场景CPU 密集型任务I/O 密集型任务I/O 密集型任务CPU 密集型任务
优势简单易理解提高 I/O 操作效率更好地利用多个任务显著提升性能
  • 同步适合简单的、任务间依赖性强的场景。
  • 异步适合 I/O 密集型的场景,如 Web 服务器。
  • 并发适用于多任务交替处理的场景,适合 I/O 密集型任务。
  • 并行适合计算密集型任务,能够充分利用多核处理器。

理解这些概念对于选择合适的编程模式、提高程序的性能和响应性至关重要。

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

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

相关文章

BERT 详解

BERT简介 BERT(Bidirectional Encoder Representations from Transformers)是由 Google 在 2018 年提出的一种预训练语言模型。BERT 在自然语言处理(NLP)领域取得了重大突破,因为它能够有效地捕捉文本的上下文信息&am…

macos 14.0 Monoma 修改顶部菜单栏颜色

macos 14.0 设置暗色后顶部菜单栏还维持浅色,与整体不协调。 修改方式如下:

数据库-MySQL-Dynamic-Datasource源码解析

文章目录 前言一、简介二、整体流程三、核心解析四、总结 前言 多数据源的应用在日常项目中也是很常见的场景。 dynamic-datasource的功能,用起来的确很方便,只需要一个DS注解,加上一些简单的配置即可完成多数据源的切换。究竟是怎么做到的…

YB2503HV:高效率降压IC,助力电动车、太阳能设备等领域的能源转换

今天我要向大家介绍一款引人注目的产品—— YB2503HV 100V 3A SOP8内置MOS 高效率降压IC。这款单片集成芯片具备可设定输出电流的开关型降压恒压驱动器功能,可广泛应用于电动车、太阳能设备、电子电池充电等领域。让我们一起来看看它的特点和应用吧! 首先…

架构-微服务架构

文章目录 前言一、系统架构演变1. 单体应用架构2. 垂直应用架构3. 分布式架构4. SOA 架构5. 微服务架构 二. 微服务架构介绍1. 微服务架构的常见问题2. 微服务架构的常见概念3. 微服务架构的常见解决方案4. 解决方案选型 三. Spring Cloud Alibaba介绍1. 主要功能2. 组件 前言 …

【一个简单的整数问题2——线段树】

题目 代码 下面的两个代码的区别在于modify的分类&#xff0c;modify最简单的分类方式是存在性分类&#xff0c;另一种类似某些query采用的三段式分类&#xff0c;详细见代码 存在性 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1…

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…

构建英语知识网站:Spring Boot框架解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Android mk/bp构建工具介绍

零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0c;加上网络上其实没有一个完整的介绍Bluedroid系列的文档&#xff0…

2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块B-1-Windows操作系统渗透测试

前言 本章节我将带领大家一起重新模拟操作一次Windows渗透测试模块&#xff0c;并加固的流程。 任务概览 环境部署 我的实验复现环境&#xff1a; 服务器Windows server 2008 R2 攻击机Kali Linux 场景操作系统Windows 7 额外还有台交换机支持&#xff1a; 这里我使用的是…

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代&#xff0c;小程序以其轻便、无需下载安装即可使用的特点&#xff0c;成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业&#xff0c;小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序&#xff0c;本文将为你提供一个从零开始的详细…

根据实验试要求,打通隧道连接服务器上的数据库,前端进行数据调用。

1.背景介绍 数据库布置在了工大实验试K80服务器上&#xff0c;本地属于外网无法直接访问校园内网。需要打通隧道&#xff0c;通过堡垒机进行服务器的访问。获取到数据库数据进行前端展示。 2.打通隧道 访问指令&#xff1a; 我选择使用Xshell打通隧道。优点&#xff1a;凭证…

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件 文章目录 使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件什么是 exe4j准备工作打包 Spring Boot 项目为 EXE 文件1.启动 exe4j2. 选择项目类型3. 配置项目名称和输出目录4. 配置项目类型或可执行文件名称5. java配…

24/11/26 视觉笔记 通过特征提取和透视变换查找对象

在本节中我们将检测和跟踪任意大小的对象&#xff0c;这些对象可能是在不同角度或者在部分遮挡的情况下观察到的。 为此我们将运用特征描述子&#xff08;Feature Descriptor&#xff09;&#xff0c;这是捕获感兴趣对象的重要属性的一种方式。我们这样是为了即使将对象嵌入繁…

【K8S问题系列 |18 】如何解决 imagePullSecrets配置正确,但docker pull仍然失败问题

如果 imagePullSecrets 配置正确&#xff0c;但在执行 docker pull 命令时仍然失败&#xff0c;可能存在以下几种原因。以下是详细的排查步骤和解决方案。 1. 检查 Docker 登录凭证 确保你使用的是与 imagePullSecrets 中相同的凭证进行 Docker 登录&#xff1a; 1.1 直接登录…

uniapp vue2项目迁移vue3项目

uniapp vue2项目迁移vue3项目&#xff0c;必须适配的部分 一、main.js 创建应用实例 // 之前 - Vue 2 import Vue from vue import App from ./App Vue.config.productionTip false // vue3 不再需要 App.mpType app // vue3 不再需要 const app new Vue({ ...App }) …

php反序列化1_常见php序列化的CTF考题

声明&#xff1a; 以下多内容来自暗月师傅我是通过他的教程来学习记录的&#xff0c;如有侵权联系删除。 一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客 一些其他大佬的wp参考&#xff1a;php_反序列化_1 | dayu’s blog (killdayu.com) 序列化一个对象将…

Web 表单开发全解析:从基础到高级掌握 HTML 表单设计

文章目录 前言一、什么是 Web 表单?二、表单元素详解总结前言 在现代 Web 开发中,表单 是用户与后端服务交互的重要桥梁。无论是用户登录、注册、搜索,还是提交反馈,表单都无处不在。在本文中,我们将从基础入手,全面解析表单的核心知识点,并通过示例带你轻松掌握表单开…

88页精品PPT | 某电信集团大数据平台建设方案技术交流

这份PPT文档是关于某电信集团大数据平台建设的技术交流方案&#xff0c;内容涵盖了现状分析、规划思路、产品设计、成功案例以及干货附录等多个部分。文档详细介绍了集团大数据平台的建设背景、技术特点、面临的挑战和痛点&#xff0c;以及具体的技术架构和实施策略。还包括了数…