python回调+io多路复用+事件循环+协程,学会了又将提高一个档次

### 简介
回调、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操作时就暂停当前协程的执行,执行其他可执行的协程,从而避免了线程切换的开销。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值