### 简介 回调、io多路复用、事件循环和协程是Python中常见的网络编程和异步编程技术,它们可以提高程序的效率和性能。 回调可以实现异步任务的执行,io多路复用可以同时处理多个IO请求,事件循环可以持续监听IO事件,协程可以实现快速切换的效果。 对于不同的应用场景,我们可以选择不同的技术来解决问题。 #### 一、回调 回调是编程中一种常见的技术,它是在函数中定义的函数,作为参数传递给另外一个函数,当这个函数完成后,它会自动调用回调函数。 下面是一个回调函数的例子: ```text def callback_function(): print("Callback function has been called.") def do_something(callback): # do something callback() do_something(callback_function) ``` 当do_something()函数完成后,会自动调用callback_function()函数。 #### 二、IO多路复用 IO多路复用是一种IO处理方式,它可以同时处理多个文件描述符的IO请求。常见的IO多路复用方式有select()、poll()和epoll()。 下面是一个使用select()进行IO多路复用的例子: ```text import select import socket s = socket.socket() s.bind(('localhost', 8000)) s.listen(5) inputs = [s] while True: rs, ws, es = select.select(inputs, [], []) for r in rs: if r is s: c, addr = s.accept() print("New connection from", addr) inputs.append(c) else: data = r.recv(1024) if not data: print("Connection closed") inputs.remove(r) else: print("Received:", data.decode()) ``` 上面的代码使用select()函数监听socket,当socket上有IO事件时,就会产生一个返回,然后程序就可以进行相应的操作。 #### 三、事件循环 事件循环是一种异步编程方式,它让程序能够持续监听IO事件,不会阻塞程序的执行,提高了程序的效率和性能。Python中常见的事件循环框架有Tornado、Twisted、asyncio等。 下面是一个使用异步编程框架asyncio进行事件循环的例子: ```text import asyncio async def coro(): print("Coroutine is running...") await asyncio.sleep(1) print("Coroutine has finished.") async def main(): print("Starting coroutine...") task = asyncio.create_task(coro()) print("Coroutine started.") await task asyncio.run(main()) ``` 上述代码使用了asyncio库中的async def定义协程函数,它和普通函数不同的是,协程函数可以在中间暂停执行,并等待某个条件满足后再继续执行。在main()中,通过create_task()函数创建了一个任务,并使用await等待其执行完成。 #### 四、协程 协程是一种轻量级的线程,它可以在运行时动态地修改调度的上下文,实现快速切换的效果。Python中常见的协程库有gevent、greenlet、asyncio等。 下面是一个使用asyncio库实现协程的例子: ```text import asyncio async def coro1(): print("Coroutine 1 is running...") await asyncio.sleep(1) print("Coroutine 1 has finished.") async def coro2(): print("Coroutine 2 is running...") await asyncio.sleep(2) print("Coroutine 2 has finished.") async def main(): await asyncio.gather(coro1(), coro2()) asyncio.run(main()) ``` 上述代码使用了asyncio库中的async def定义协程函数,在main()函数中使用asyncio.gather()执行多个协程。在协程函数中使用await关键字,当遇到IO操作时就暂停当前协程的执行,执行其他可执行的协程,从而避免了线程切换的开销。
python回调+io多路复用+事件循环+协程,学会了又将提高一个档次
于 2018-12-23 19:09:00 首次发布