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