面试题答案
一键面试使用Python多线程处理多个客户端请求
- 导入必要模块:
import socket import threading
- 定义处理客户端请求的函数:
def handle_client(client_socket): try: request = client_socket.recv(1024) # 处理HTTP请求,例如解析请求头、生成响应等 response = "HTTP/1.1 200 OK\r\nContent - Type: text/html\r\n\r\n<html><body>Hello, World!</body></html>" client_socket.sendall(response.encode()) except Exception as e: print(f"Error handling client: {e}") finally: client_socket.close()
- 创建服务器并监听端口:
def start_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind(('127.0.0.1', 8080)) server_socket.listen(5) print("Server is listening on port 8080") while True: client_socket, client_address = server_socket.accept() client_thread = threading.Thread(target=handle_client, args=(client_socket,)) client_thread.start()
- 启动服务器:
if __name__ == "__main__": start_server()
多线程带来的资源竞争问题
- 数据共享冲突:多个线程同时访问和修改共享数据,例如全局变量。比如多个线程同时对一个全局计数器进行加一操作,可能导致结果不准确。
- 文件操作冲突:如果多个线程同时对一个文件进行读写操作,可能会导致文件数据混乱。
解决资源竞争问题的方法
- 锁机制(Lock):
- 原理:通过获取锁(
acquire
)来独占访问共享资源,访问完毕后释放锁(release
)。 - 示例:
lock = threading.Lock() shared_variable = 0 def increment(): global shared_variable lock.acquire() try: shared_variable += 1 finally: lock.release()
- 原理:通过获取锁(
- 信号量(Semaphore):
- 原理:允许一定数量的线程同时访问共享资源。例如,设置信号量的值为3,则最多允许3个线程同时访问共享资源。
- 示例:
semaphore = threading.Semaphore(3) def access_shared_resource(): semaphore.acquire() try: # 访问共享资源的代码 pass finally: semaphore.release()
- 队列(Queue):
- 原理:使用队列在多线程间安全地传递数据,避免直接共享数据带来的竞争问题。
- 示例:
from queue import Queue work_queue = Queue() def producer(): for i in range(10): work_queue.put(i) def consumer(): while True: item = work_queue.get() if item is None: break # 处理数据的代码 print(f"Processing {item}") work_queue.task_done()