回调函数是一种常用的编程技术,主要用于异步编程,可以在某些特定的条件下调用指定的函数,以实现业务逻辑的灵活操作。在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将被执行,处理接收到的客户端数据。