RQ任务执行requests请求时意外终止(Signal 11段错误)求助
解决RQ任务中requests请求触发Signal 11段错误的方案
以下是针对该问题的实用解决思路:
检查依赖版本兼容性
段错误常和依赖库版本冲突有关,尤其是requests、django-rq、RQ之间的版本适配问题。建议:- 锁定稳定版本的依赖,比如将requests固定在2.31.0、django-rq固定在最新兼容Django的稳定版,执行
pip install --upgrade requests django-rq rq更新依赖。 - 单独检查requests依赖的urllib3版本,尝试降级或升级urllib3(例如
pip install urllib3==1.26.18),部分旧版urllib3在fork进程环境下可能存在内存访问问题。
- 锁定稳定版本的依赖,比如将requests固定在2.31.0、django-rq固定在最新兼容Django的稳定版,执行
修改RQ Worker的运行模式
RQ默认使用fork模式启动worker进程,fork后的子进程可能共享父进程的内存资源引发冲突。可以:- 启动worker时添加
--no-fork参数,让worker直接在主进程执行:python manage.py rqworker default --no-fork - 减少worker并发数,比如只启动单个worker进程,避免多进程竞争内存资源。
- 启动worker时添加
隔离requests的运行环境
避免全局共享requests资源,在任务内部初始化会话或延迟导入:- 使用Session对象隔离请求上下文:
def req_call(): session = requests.Session() url = 'https://jsonplaceholder.typicode.com/posts' response = session.get(url) session.close() return response - 延迟导入requests到任务函数内部,避免模块加载阶段初始化全局资源:
@django_rq.job('default') def test_request_call_on_rq_job(): import requests url = 'https://jsonplaceholder.typicode.com/posts' response = requests.get(url) log.warning(f"REQUEST's RESPONSE {response.json()}")
- 使用Session对象隔离请求上下文:
排查系统级内存问题
- 用
free -h命令检查服务器内存使用情况,若内存不足,可能导致进程内存访问异常,需扩容内存或清理其他占用内存的进程。 - 排查是否有安全软件、内存监控工具拦截worker进程的内存访问,这类工具可能误判进程行为导致段错误。
- 用
替换HTTP请求库
如果以上方法无效,尝试切换到其他HTTP库绕开requests的问题,比如使用httpx:import httpx @django_rq.job('default') def test_request_call_on_rq_job(): url = 'https://jsonplaceholder.typicode.com/posts' response = httpx.get(url) log.warning(f"REQUEST's RESPONSE {response.json()}")
内容的提问来源于stack exchange,提问作者Ramchandra Shahi Thakuri
相关产品推荐
相关产品推荐

