
你可以把事件循环(Event Loop) 想象成一个无限循环的“调度中心”或“指挥官”。它的核心任务非常简单,以I/O操作为例:
它的最大优势:用单线程实现高并发。
在一个传统的多线程程序中,每个连接都需要一个线程,线程的创建、切换和销毁开销很大。而事件循环在单个线程内通过“任务切换”的方式处理海量的I/O操作。在I/O等待期间,CPU不会空闲,而是去执行其他可以执行的任务,从而极大地提高了程序的效率和吞吐量,特别适合处理网络请求、文件操作等I/O密集型场景。
Python 有哪些事件循环库?
基于 asyncio(主流首选)
import asyncio, uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
asyncio.run(main())
Tornado(IOLoop)
非 asyncio(自带或不同模型的事件循环/并发框架)
GUI 专用/与 asyncio 的桥接
事件循环库示例
让事件循环管理任务,首先要设计任务,任务是可以执行完就退出,或者循环不退出的。
然后事件循环库添加任务,最后执行.run() 函数启动事件循环,线程就在事件循环库的调度下运行了,主程序就阻塞在那了, 等待任务执行完。
asyncio的简单示例:
import asyncio
## 单个任务
async def hello_sleep_world():
print('Hello ...')
await asyncio.sleep(1)
print('... World!')
asyncio.run(hello_sleep_world())
#
# Hello ...
# ... World!
## 多个任务
async def main():
return await asyncio.gather(
hello_sleep_world(),
hello_sleep_world(),
hello_sleep_world()
)
asyncio.run(main())
# Hello ...
# Hello ...
# Hello ...
# ... World!
# ... World!
# ... World!
GUI库Thinker示例:

import tkinter as tk
from tkinter import ttk
class ProgressBarApp:
def __init__(self, root):
self.root = root
self.root.title("进度条示例")
self.is_running = False
# 进度条
self.progress = ttk.Progressbar(root, length=300, mode='determinate')
self.progress.pack(pady=20)
# 百分比标签
self.percent_label = tk.Label(root, text="0%")
self.percent_label.pack()
# 按钮框架
self.btn_frame = tk.Frame(root)
self.btn_frame.pack(pady=10)
# 开始按钮
self.start_btn = tk.Button(self.btn_frame, text="开始", command=self.start_progress)
self.start_btn.pack(side=tk.LEFT, padx=5)
# 暂停按钮
self.pause_btn = tk.Button(self.btn_frame, text="暂停", command=self.pause_progress, state=tk.DISABLED)
self.pause_btn.pack(side=tk.LEFT, padx=5)
# 复位按钮
self.reset_btn = tk.Button(self.btn_frame, text="复位", command=self.reset_progress)
self.reset_btn.pack(side=tk.LEFT, padx=5)
def start_progress(self):
self.is_running = True
self.start_btn.config(state=tk.DISABLED)
self.pause_btn.config(state=tk.NORMAL)
self.update_progress()
def pause_progress(self):
self.is_running = False
self.start_btn.config(state=tk.NORMAL)
self.pause_btn.config(state=tk.DISABLED)
def update_progress(self):
if self.is_running and self.progress['value'] < 100:
self.progress['value'] += 5
self.percent_label.config(text=f"{self.progress['value']}%")
self.root.after(500, self.update_progress)
elif self.progress['value'] >= 100:
self.is_running = False
self.start_btn.config(state=tk.DISABLED)
self.pause_btn.config(state=tk.DISABLED)
def reset_progress(self):
self.is_running = False
self.progress['value'] = 0
self.percent_label.config(text="0%")
self.start_btn.config(state=tk.NORMAL)
self.pause_btn.config(state=tk.DISABLED)
root = tk.Tk()
app = ProgressBarApp(root)
root.mainloop()