python回调函数的应用场景

  • Post category:Python

回调函数是一种常用的编程技术,主要用于异步编程,可以在某些特定的条件下调用指定的函数,以实现业务逻辑的灵活操作。在Python中,回调函数的应用场景非常广泛,比如多线程、网络编程等领域。

一、多线程编程
在多线程编程中,经常需要使用回调函数来通知主线程某个子线程的执行结果。例如下面的代码:

import threading

def worker(callback):
    print('开始执行任务...')
    # 模拟耗时操作
    for i in range(100000000):
        pass
    print('任务执行完成!')
    # 回调通知主线程任务完成
    callback('任务执行成功!')

def on_complete(result):
    print('任务回调函数被执行,结果为:{}'.format(result))

if __name__ == '__main__':
    # 创建子线程并启动
    thread = threading.Thread(target=worker, args=(on_complete,))
    thread.start()
    print('主线程继续执行...')

在这个例子中,我们通过传递on_complete回调函数来通知主线程,当子线程执行完成时,回调函数将被执行。回调函数的形参result是子线程执行结果数据。

二、网络编程
在网络编程中,回调函数也是经常被使用的一种技术,在实现事件驱动模型时,回调函数能够帮助我们高效地处理网络事件。例如下面的代码:

import socket

def handle_request(data, addr):
    print('处理请求数据:{},地址:{}'.format(data, addr))
    # 直接回复客户端接收到的数据
    conn.sendall(data)

def worker(sock, callback):
    while True:
        # 等待客户端连接
        conn, addr = sock.accept()
        print('接收到客户端连接:{}'.format(addr))
        # 接收客户端数据
        data = conn.recv(1024)
        # 执行回调函数处理数据
        callback(data, addr)
        conn.close()

if __name__ == '__main__':
    # 创建TCP套接字对象
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定地址,并开始监听连接
    sock.bind(('127.0.0.1', 9000))
    sock.listen(5)
    print('服务器启动,等待客户端连接...')
    # 创建工作线程,并指定回调函数
    thread = threading.Thread(target=worker, args=(sock, handle_request))
    thread.start()
    thread.join()

在这个例子中,我们创建了一个TCP Socket服务端,并启动了一个工作线程来处理客户端的连接。当有客户端连接时,回调函数handle_request将被执行,处理接收到的客户端数据。