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

在无限循环中发送大量请求时,如何控制python线程?,python,multithreading,grequests,Python,Multithreading,Grequests,情况是这样的。 我需要每秒向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=js

情况是这样的。 我需要每秒向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)
当我运行Server django并发送这个ajax请求时,python的线程数量一直在增加,直到出现错误“无法启动新线程”。

错误:无法启动新线程
由于错误而失败
如何控制线程的数量?我不知道,因为我是一个初学者。
非常感谢。

也许您的
描述ip\u列表太长了,因此对于100个ip,您将产生100个请求,由100个线程发出

你应该做什么:

您可能应该在
map()
调用中指定
size
参数,以获得一个合理的数字,
可能是(2*n+1),其中n是CPU中的最大内核数。它将确保您不会同时处理
desc\u ip\u列表中的所有ip,从而产生尽可能多的线程

编辑:更多信息,来自:

Pool类是Group的一个子类,它提供了一种限制并发性的方法:如果池中的greenlet数量已经达到限制,它的spawn方法将阻塞,直到有一个空闲的槽为止

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

map()
中,我们从第113-114行获得:

pool = Pool(size) if size else None
jobs = [send(r, pool, stream=stream) for r in requests]
send()
的第85行中,我们有:

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

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