简单解释同步、异步、阻塞、非阻塞、中断、轮询、多线程,协程这几个概念(代码未验证,仅参考)
创始人
2024-06-02 19:30:17

科普

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

同步( 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: # 没有新数据可供处理continuehandle_new_data(result)  

多线程:

import threadingdef 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 asyncioasync 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

相关内容

热门资讯

中信证券:2026年度造纸行业... 转自:财联社【中信证券:2026年度造纸行业预计底部改善 金属包装行业将迎来春天】财联社11月21日...
财联社汽车早报11月21日 转自:财联社两部门发布《新能源汽车政府采购需求标准(征求意见稿)》11月20日,财政部会同工业和信息...
四川阆中警方凌晨通报 转自:北京日报客户端11月21日凌晨,四川省阆中市公安局发布“警情通报”:11月20日,阆中市一学生...
@近视的你 当心甜食正在悄悄损... 来源:央视新闻客户端 用眼过度、强光刺激……这些常见的视力“杀手”相信大家都不陌生但日常生活中有一个...
直击车展 | MoLA架构发布...   Hehson科技讯 11 月 21日上午消息,在华为乾崑生态大会上,华为智能汽车解决方案 BU ...