如何关闭Python中polygon-api-client的残留API连接?
解决polygon-api-client连接无法关闭导致终端阻塞的问题
出现QSocketNotifier: Can only be used with threads started with QThread错误且终端无法恢复,本质是polygon客户端(尤其是WebSocket组件)未正确释放后台连接/线程,连带httpx连接池或wsdump的Qt相关资源残留,导致进程无法正常退出。以下是针对性解决方案:
1. 显式管控客户端生命周期
REST客户端:优先用上下文管理器
polygon的RESTClient支持上下文管理器,会自动在代码块结束后关闭连接、清理资源,避免手动遗漏:
from polygon import RESTClient # 用with块自动管理客户端 with RESTClient(api_key="YOUR_API_KEY") as client: # 执行你的查询逻辑 agg_data = client.get_aggs("AAPL", 1, "day", "2024-01-01", "2024-01-02") print(agg_data) # 退出with块后,客户端自动关闭,连接池被清理
WebSocket客户端:强制调用关闭方法
WebSocket客户端会启动后台线程监听推送,必须主动调用close()或stop()方法终止线程:
from polygon import WebSocketClient client = WebSocketClient(api_key="YOUR_API_KEY", subscriptions=["T.AAPL"]) try: # 启动监听(如果是同步运行) client.run() finally: # 无论是否异常,都确保关闭客户端 client.close()
2. 清理httpx连接池
polygon-api-client依赖httpx处理HTTP请求,若手动传入了httpx.Client实例,需显式关闭以释放连接池:
import httpx from polygon import RESTClient httpx_client = httpx.Client() polygon_client = RESTClient(api_key="YOUR_API_KEY", http_client=httpx_client) try: # 执行查询 data = polygon_client.get_ticker_details("AAPL") finally: # 先关闭polygon客户端,再关闭httpx客户端 polygon_client.close() httpx_client.close()
3. 解决QSocketNotifier线程错误
该错误由wsdump的Qt组件引发(polygon WebSocket客户端依赖它),需在程序结束前清理Qt资源:
from PyQt5.QtCore import QCoreApplication import sys # 在程序所有逻辑执行完毕后添加 if QCoreApplication.instance(): QCoreApplication.instance().quit() sys.exit()
4. 极端情况:强制捕获退出信号
如果上述方法仍无法解决,可通过信号处理函数在程序终止前强制清理资源:
import signal import sys from polygon import RESTClient client = None def cleanup(signum, frame): global client if client: client.close() sys.exit(0) # 注册中断信号处理(Ctrl+C) signal.signal(signal.SIGINT, cleanup) signal.signal(signal.SIGTERM, cleanup) # 主程序逻辑 client = RESTClient(api_key="YOUR_API_KEY") data = client.get_aggs("AAPL", 1, "day", "2024-01-01", "2024-01-02") print(data)
内容的提问来源于stack exchange,提问作者Beetle Ds Family Gaming Channe
相关产品推荐
相关产品推荐

