简单解释同步、异步、阻塞、非阻塞、中断、轮询、多线程,协程这几个概念(代码未验证,仅参考)

2023-11-05

科普

同步和异步的区别:
同步和异步是指程序执行的方式,其中同步指程序按顺序执行,每个任务必须等待前面的任务执行完成后才能执行,而异步则指程序可以在执行一个任务时同时执行另一个任务,不需要等待前一个任务执行完毕。

同步( Synchronous )

指的是在执行一个操作时,必须等待该操作完成后才能进行下一步操作。在同步模式下,程序的执行顺序是由代码的顺序决定的。只有一个控制流

异步( Asynchronous )

指的是在执行一个操作时,不需要等待该操作完成,可以同时进行其他操作。在异步模式下,程序的执行顺序不受代码顺序的限制,而是由事件的发生顺序决定的。至少有两个控制流

阻塞和非阻塞的区别:
阻塞和非阻塞是指程序在等待一个操作完成时的状态,其中阻塞指程序在等待操作完成期间无法执行其他操作,而非阻塞则指程序在等待操作完成的同时可以继续执行其他操作。

阻塞( Blocking )

指的是在执行一个操作时,如果该操作没有完成,程序会一直等待,直到该操作完成后才能继续执行下一步操作。

非阻塞( Non-blocking )

指的是在执行一个操作时,如果该操作没有完成,程序不会等待,而是立即返回,继续执行下一步操作。

中断和轮询的区别 :
中断和轮询是指程序获取外部事件的方式,其中中断指程序通过注册一个中断处理程序来响应事件,而轮询则指程序周期性地查询事件是否发生。

中断( Interrupt )

指的是在执行一个操作时,如果发生了某个事件,程序会暂停当前操作,转而去处理事件,处理完事件后再回到原来的操作继续执行。

轮询( Polling )

指的是在执行一个操作时,程序会不断地查询某个状态或者事件是否发生,直到状态或事件发生为止。

多线程( Multithreading )

多线程是指在一个进程内同时执行多个线程,每个线程可以独立地执行不同的任务。多线程可以提高程序的并发性和响应性,但也需要考虑线程同步和资源竞争等问题。

协程( Coroutine )

指的是一种轻量级的线程,可以在一个线程中同时执行多个协程,每个协程可以独立执行一个任务,协程的切换是由程序自己控制的,不需要操作系统的干预,协程可以提高程序的并发性和响应性,也可以避免多线程中的线程同步和资源竞争问题。



Python 示例:

同步:

import time
def task_1():
    print("Task 1 started")
    time.sleep(2)
    print("Task 1 finished")
def task_2():
    print("Task 2 started")
    time.sleep(3)
    print("Task 2 finished")
task_1()
task_2()

异步:

import asyncio
async def task_1():
    print("Task 1 started")
    await asyncio.sleep(2)
    print("Task 1 finished")
async def task_2():
   print("Task 2 started")
   await asyncio.sleep(3)
   print("Task 2 finished")
loop = asyncio.get_event_loop()
tasks = [loop.create_task(task_1()), loop.create_task(task_2())]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

阻塞:

with open('file.txt', 'r') as f:
     data = f.read() # 程序将会被阻塞直到文件读取完毕
     process_data(data) 

非阻塞:

import select 
while True:
     ready_to_read, _, _ = select.select([socket], [], [], timeout_in_seconds)
     
     if ready_to_read:
         data = socket.recv(buffer_size) # 如果没有数据可读,则此处立即返回
         process_data(data) 

中断:

try:
      while True:
          do_something()
except KeyboardInterrupt: # 用户按下了Ctrl+C键
      cleanup_and_exit()  

轮询:

while not done:
       result = poll_socket_for_data(socket)
       if result is None: # 没有新数据可供处理
           continue
       handle_new_data(result)  

多线程:

import threading

def worker(num):
    """thread worker function"""
    for i in range(num):
        time.sleep(0.5)
        print(f'Worker {num} working')
        
threads=[]
for i in range(5):
    t=threading.Thread(target=worker,args=(i,))
    threads.append(t)
for thread in threads:
       thread.start()
for thread in threads:
       thread.join()

协程:

import asyncio

async def coroutine(i):
     """
     Coroutine that takes an integer argument and prints it.
     """
     while True:
         await asyncio.sleep(i+0.5)
         now=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
         message=f'{now}: Coroutine {i}'
         print(message)
tasks=[coroutine(i) for i in range (4)]
loop=asyncio.get_event_loop()
try :
       loop.run_until_complete(asyncio.gather(*tasks))
except KeyboardInterrupt :
       pass
finally :
       loop.close()

来源:
Fibers, Oh My!
https://graphitemaster.github.io/fibers/
https://www.v2ex.com/t/923159#reply9

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单解释同步、异步、阻塞、非阻塞、中断、轮询、多线程,协程这几个概念(代码未验证,仅参考) 的相关文章

随机推荐

  • HTML表格(table)实例

    实例1 课程表 table border 1 width 60 cellpadding 2 caption 课程表 caption tr align center td 时间 日期 td td 一 td tr table
  • 附近的商店

    看着每天的感染数据在下降 上海解封的日子快到了 打开美团看看附近店铺有没有好吃 准备解封大吃特吃一顿 排序按照距离优先 还有附近几公里之内的店铺 想了解这个功能怎么实现的 查了网上资料 得到的常用的算法是 geohash 和 S2 Geoh
  • Reverse题常规步骤

    Reverse题常规步骤 1 查壳 一般难度的题目都是加了壳的 都需要进行壳分析 2 脱壳 有壳就脱壳 3 IDA逆向 脱完壳以后用IDA进行逆向分析
  • CentOS7.x环境下安装Docker以及常用命令

    Docker官方建议在Ubuntu中安装 因为Docker是基于Ubuntu发布的 而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的 在很多版本的CentOS中是不支持更新最新的一些补丁包的 我这里将Docker安装到阿里云
  • 人脸识别损失函数综述(附开源地址)

    原文 人脸识别损失函数综述 附开源地址 原文地址 https zhuanlan zhihu com p 51324547 常用的度量学习损失方法有对比损失 Contrastive loss 三元组损失 Triplet loss 四元组损失
  • Android 蓝牙串口通信Demo

    目录 一 前言 二 效果图 三 源码 带注释 1 布局代码 2 Java代码 3 权限声明 四 注意 五 项目源码下载 一 前言 在学校和机电的同学组队准备做一个智能小车去参加比赛 需要我开发一个小车的控制app 所以我开始学习蓝牙串口通信
  • 一文带你深入了解HTTP

    http的发展史 在学习网络之前 了解它的历史能够帮助我明白为何它会发展为如今这个样子 能让我有探究它的兴趣 下面的这张图片就展示了 互联网 诞生至今的发展历程 http是什么 HyperTextTransferProtocol 直译为 超
  • sql代码转换小工具(delphi)

    1 下载 2 粘贴sql语句 3 msql转换为delphi sql语句
  • shell脚本基础3——正则表达式

    文章目录 一 基本了解 二 基本正则表达式 2 1 字符匹配 2 2 位置锚定 2 3 匹配次数 2 4 分组 三 扩展正则表达式 3 1 字符匹配 3 2 位置锚定 3 3 匹配次数 3 4 分组 3 5 或者 一 基本了解 正则表达式分
  • 对表的简单查询

    SQL命令对表进行查询 目录 SQL命令对表进行查询 1 无条件查询 2 条件查询 3 统计汇总查询 4 分组查询 5 对查询结果排序 1 无条件查询 无条件查询指只包含 SELECT FROM 的查询 这种查询最简单 例如 在S表中查询所
  • Android Studio安装中的问题及第一次运行hello world程序

    总结一下 在安装Android Studio中可能出现和遇到的问题 并给出解决方案 1 AS在安卓官网可以直接下载完整的安装包 2 SDK找不到的情况 可以自己下载 参考 https www jianshu com p 4ac1313b50
  • 自定义动态数据源

    文章目录 准备 业务流程分析 代码实现 网页上切换数据源 准备 mysql spring boot 配置依赖 配置文件 数据源配置 spring datasource type com alibaba druid pool DruidDat
  • UnityVR--小程序3--金色的子弹2

    子弹需要一个打击目标 目标具备一定的生命值 HP 当生命值将为0时 目标被击落并消失 1 前篇的AXButton cs脚本不需要修改 2 子弹的程序Bullet cs中 OnTriggerEnter Collider other 函数修改为
  • 肖战

    肖战是中国内地男演员 歌手 主持人 毕业于中央戏剧学院表演系 他曾出演过多部影视剧 包括 花千骨 武媚娘传奇 和 长安十二时辰 此外 他还是一位多才多艺的歌手 曾发行过多张个人音乐专辑
  • 苹果开发平台常用网址链接

    苹果开发者中心 https developer apple com cn 苹果开发者中心 企业类型 https developer apple com cn programs enterprise 注册账号 https developer
  • react+antd实现Table拖拽调整列宽

    注意 列需要传入 width 并且配合下面的css样式才能显示拖拽手势 import React useEffect useState from react import Table from antd import Resizable f
  • PE半透明屏是怎么制造的?工艺、材料、应用

    PE半透明屏是一种新型的屏幕材料 具有半透明的特点 它由聚乙烯 PE 材料制成 具有良好的透明度和柔韧性 PE半透明屏广泛应用于建筑 广告 展览等领域 具有很高的市场潜力 PE半透明屏的特点之一是其半透明性 它可以在一定程度上透过光线 使得
  • 相关性分析热力图(Python&Matlab代码实现)

    目录 1 热力图 1 1 简介 1 2 语法 2 算例1 Python代码实现 2 1 算例 2 2 Python代码 2 3 运行结果 3 算例2 Python代码实现 4 算例3 Python代码实现 4 1 算例 4 2 Python
  • 小电容通高频大电容通低频的理解

    本文参考为什么电容通高频阻低频 记录下个人理解并总结 1 电容的作用是通高频阻低频 高频的时候电容总是还没充满电 负半周期便到来 所以电流始终存在 低频的时候信号交流电负半周还没到来 电容已充满电便发生断路 2 理论上电容越大 能通越高的高
  • 简单解释同步、异步、阻塞、非阻塞、中断、轮询、多线程,协程这几个概念(代码未验证,仅参考)

    科普 同步和异步的区别 同步和异步是指程序执行的方式 其中同步指程序按顺序执行 每个任务必须等待前面的任务执行完成后才能执行 而异步则指程序可以在执行一个任务时同时执行另一个任务 不需要等待前一个任务执行完毕 同步 Synchronous