如何控制和关闭python 线程

发布于 2022-09-01 22:31:07 字数 857 浏览 14 评论 0

碰到这样一个需求。
1、前端页面 每秒需要发出一个ajax请求。
2、django后端某个view接受到这个请求后,需要向第三方API异步get请求10个数据
3、这些数据会渲染到前端页面。

view中的get请求代码如下,其中用了grequests异步请求:

desc_ip_list=['58.222.24.253', '58.222.17.38']
reqs = [grequests.get('%s%s' % ('http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=', desc_ip))
        for desc_ip in desc_ip_list]
response = grequests.map(reqs)

现在的问题是 前端不停的发送ajax请求。 查看python的线程会不断增加,直到报错(无法开启新线程)

**error: can't start new thread
<Greenlet at 0x110473b90: <bound method AsyncRequest.send of <grequests.AsyncRequest object at 0x1103fd1d0>>(stream=False)>
failed with error**

图片描述

所以想问的就是从代码层面如何控制 python的线程?或者说当之前的请求结束之后 如何关闭之前的线程?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情绪操控生活 2022-09-08 22:31:07

这不是线程的问题, 而是设计的问题。 通常这种需求的较为合理的设计方法:

  1. 增加一个异步任务系统, 不需要自己写, 用 celery 框架。

  2. view 接到请求之后, 存一条数据到数据库, 并且状态设为 “未完成”, 然后调用celery。 因为celery是异步系统, 所以view立刻返回。

  3. 当celery完成操作之后, 将这条记录的状态设置为“已完成”

  4. ajax 继续不断查询view, 通过view再查询view, 根据得到的 “未完成” 或者 “已完成” 状态, 显示相应的信息。

以上步骤听起来复杂, 有过做异步系统的经验就不难了。 祝你好运

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文