Python Requests中如何在后台线程等待请求响应?
解决方法
你的代码里,send_request函数中的requests.get()本身就会阻塞子线程直到拿到响应,子线程已经在等待响应了。如果你是想让主线程感知响应完成、拿到结果,同时不在主线程调用requests.get(),可以用以下几种方式:
1. 直接在线程内部处理响应
这是最简单的方式,拿到响应后直接在子线程里完成后续逻辑,主线程完全不用干预:
import requests import threading def send_request(): response = requests.get(url="https://www.google.com/") # 在这里直接处理响应 if response.ok: print(f"请求成功,响应内容长度:{len(response.text)}") else: print(f"请求失败,状态码:{response.status_code}") threading.Thread(target=send_request, daemon=False).start() # 主线程可以继续执行自己的任务,不用管请求的事
2. 用队列传递响应结果给主线程
如果需要主线程拿到响应结果,但不想直接调用requests.get(),可以用队列安全传递数据:
import requests import threading from queue import Queue def send_request(result_queue): response = requests.get(url="https://www.google.com/") # 将响应放入队列 result_queue.put(response) result_queue = Queue() thread = threading.Thread(target=send_request, args=(result_queue,), daemon=False) thread.start() # 主线程可以先做其他事,之后再从队列取结果 # 如果要等响应回来再继续,就调用join()等待线程结束 thread.join() response = result_queue.get() # 这里的get()是队列的方法,不是requests的get() print(f"主线程拿到响应状态码:{response.status_code}")
3. 用回调函数处理响应
定义一个处理响应的回调函数,子线程拿到响应后自动调用:
import requests import threading def handle_response(response): # 这里写处理响应的逻辑 print(f"回调函数处理响应:状态码{response.status_code}") def send_request(callback): response = requests.get(url="https://www.google.com/") callback(response) threading.Thread(target=send_request, args=(handle_response,), daemon=False).start() # 主线程继续执行,回调会在子线程中触发
注意:requests.get()在子线程里是同步阻塞的,所以子线程会一直等到响应返回才会执行后续代码,你不用额外写"wait for the response"的逻辑。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

