由多线程导致的request请求参数获取不到问题

症状

代码还是按照常规写法写的,莫名其妙的忽然使用request拿不到参数。

43491f987c642d7ab9bc5ead966d5312ff7.jpg

如上面的代码,springmvc帮我们自动做的映射数据拿不到数据,使用request.getParameter("dpId") 也拿不到数据。 @RequestParam  等等方式都试过就是拿不到。

再说页面,这个bug还神奇的在这里,先说业务,我们这个系统会先进入一个页面,这个页面是一个数据下发状态的显示,这时候用户会有一个操作,点击页面的下发数据操作,这时候后台会启动一个线程执行下发数据操作(这个操作是很耗时的),线程启动后返回,前端判断已经启动成功,就会再次刷新这个页面。这个时候,就会出现上面这个错误,拿不到前端参数,如果切换到其他的页面,还是可以正常获取参数。

定位过程:最开始是怀疑请求的方式有问题,换了get  post ,参数都有就是拿不到,然后怀疑是请求的类型有问题,

7be6e6f1ebc87d3a90f460fb1930983eb32.jpg

这些换了还是存在这个问题,然后配置打开tomcat的容器日志,

dc01f08bf08dc073050b8156ca06773aa21.jpg

可以看到参数是被tomcat拿到了的,基本可以排除是前端的问题了,那后端就可能是拦截器这里搞的鬼,再次检查全部的拦截器,这时候发现

request.getQueryString();

可以拿到参数,request.getParmeter 还是拿不到参数,然后各种bug排查,最终还是没定位到。最后,异想天开的将

3e5847a8aa654d31c2908487460fc1f721b.jpg

如上代码,启动线程这一块注释掉,可以获取到参数了,问题终于定位到是多线程这里的问题。

那到底是哪里的问题呢?

线程中的各种异常都处理了,唯一有点不一样的是,request是传入的,这个类我并不太了解,会不会是这里的问题,将request中的数据拿出来后,单独传入必要的参数后,问题解决了,基本可以确定是request传入到多线程中导致的问题了,而且也可以解释因为为什么第二次请求会有问题,切换页面请求又没有问题了,很大可能就是request是同一个request导致的。

转载于:https://my.oschina.net/sprouting/blog/3045489

在 Django 中使用多线程处理带参数请求获取返回结果,可以使用 Python 内置的 threading 模块或者使用 Django 自带的线程池 ThreadPoolExecutor。 使用 threading 模块: 1. 在视图函数中创建线程并传入参数: ``` import threading def my_view(request): t = threading.Thread(target=long_running_job, args=(arg1, arg2)) t.start() return HttpResponse('Thread started') ``` 2. 在线程中处理长时间运行的任务,并返回结果: ``` def long_running_job(arg1, arg2): # do something that takes a long time result = 'some result' return result ``` 需要注意的是,在线程中返回结果无法直接返回给视图函数,需要使用队列将结果传递回主线程,例如: ``` import threading from queue import Queue def my_view(request): results = Queue() t = threading.Thread(target=long_running_job, args=(arg1, arg2, results)) t.start() result = results.get() return HttpResponse(result) def long_running_job(arg1, arg2, results): # do something that takes a long time result = 'some result' results.put(result) ``` 使用 ThreadPoolExecutor: 1. 安装 concurrent.futures 包。 2. 在 settings.py 中配置线程池大小: ``` CONCURRENT_REQUESTS = 8 # 设置线程池大小 ``` 3. 在视图函数中使用线程池并传入参数: ``` from concurrent.futures import ThreadPoolExecutor executor = ThreadPoolExecutor(CONCURRENT_REQUESTS) def my_view(request): future = executor.submit(long_running_job, arg1, arg2) result = future.result() return HttpResponse(result) ``` 4. 在线程中处理长时间运行的任务,并返回结果: ``` def long_running_job(arg1, arg2): # do something that takes a long time result = 'some result' return result ``` 需要注意的是,使用多线程处理请求可能会带来一些风险和不确定性,需要谨慎使用,特别是在涉及到访问共享资源或者并发性能问题的情况下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值