繁体   English   中英

在无限循环中发送大量请求时,如何控制python线程?

[英]How can I control python thread when I send a lot requests in a limitless loop?

这是情况。 我需要每秒向Django视图函数发送一个ajax请求,并且该视图函数会将一些异步请求发送给第三方API,以通过grequests获取一些数据。 返回此视图函数后,这些数据将呈现为HTML。 这里显示代码

  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)

当我运行django服务器并发送此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

如何控制线程数量? 我不知道这是因为我是一名初学者pythoner。 非常感谢。

也许您的desc_ip_list太长,因此,假设有100个IP,您将产生100个线程(由100个线程发出)的请求!

参见grequests代码

您应该做什么:

您可能应该在map()调用中将size参数指定为一个合理的数字,可能是(2 * n + 1),其中n是您CPU中的内核数, 最大为 这将确保您不会同时处理desc_ip_list中的所有IP,从而产生了尽可能多的线程。

编辑:更多信息,来自gevent文档页面

池类是Group的子类,它提供了一种限制并发的方法:如果池中的greenlet数量已达到限制,则其生成方法将阻塞,直到有可用插槽为止。

我为什么要提这个呢? 让我们追溯到grequests:

map() ,我们来自第113-114行:

pool = Pool(size) if size else None
jobs = [send(r, pool, stream=stream) for r in requests]

send() lineno 85中,我们有:

return gevent.spawn(r.send, stream=stream)

这是将从send()执行的return语句,因为其参数pool将为None,因为在map()中,您未指定size 现在回到上面几行,阅读我在gevent文档中引用的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM