Python gevent:大量繁殖小绿豆的缺点是什么?

Python gevent:大量繁殖小绿豆的缺点是什么?,python,limit,gevent,spawning,Python,Limit,Gevent,Spawning,以下是我在对问题的评论中提出的问题: 假设一个人有大量任务,那么使用gevent.spawn(…)来同时生成所有任务,而不是使用gevent池和pool.spawn(…)来限制并发greenlet的数量,有什么缺点吗 以不同的方式表述:即使要解决的问题不需要使用gevent.Pool,“限制并发”是否有任何好处 你知道什么会构成这个问题的“大数字”吗?这只是一个更干净的方法,也是处理很多东西的好方法。几周前我遇到了这个问题,当时我正在使用gevent spawn验证一堆针对DNS的电子邮件,数量

以下是我在对问题的评论中提出的问题:

假设一个人有大量任务,那么使用gevent.spawn(…)来同时生成所有任务,而不是使用gevent池和pool.spawn(…)来限制并发greenlet的数量,有什么缺点吗

以不同的方式表述:即使要解决的问题不需要使用gevent.Pool,“限制并发”是否有任何好处


你知道什么会构成这个问题的“大数字”吗?

这只是一个更干净的方法,也是处理很多东西的好方法。几周前我遇到了这个问题,当时我正在使用gevent spawn验证一堆针对DNS的电子邮件,数量约为30k:)

我在测试中发现,当并发性在200左右时,我的机器负载将在EC2M1.small上徘徊在1左右。不过,我做得有点幼稚,如果我再做一次,我会运行多个池,并在它们之间休眠一段时间,以尝试更均匀地分配NIC和CPU上的负载


最后要记住的一件事是密切关注打开的文件,并在需要时增加:。我运行的greenlet占用了每个greenlet大约5个文件描述符,因此如果不小心的话,可以很快用完。如果您的系统负载高于1,这可能没有帮助,因为不管怎样,您都会看到收益递减。

来自谷歌,并决定运行一些快速测试,以产生越来越多的
N
greenlet。分享搜索结果,因为它们可能对其他搜索者有用:

# 1 greenlet
real    0m1.032s
user    0m0.017s
sys     0m0.009s

# 100 greenlets
real    0m1.037s
user    0m0.021s
sys     0m0.010s

# 1,000 greenlets
real    0m1.045s
user    0m0.035s
sys     0m0.013s

# 10,000 greenlets
real    0m1.232s
user    0m0.265s
sys     0m0.059s

# 100,000 greenlets
real    0m3.992s
user    0m3.201s
sys     0m0.444s
因此,高达1000个greenlet,性能损失很小,但一旦开始达到10000多个greenlet,一切都会变慢

测试代码:

import gevent

N = 0

def test():
    gevent.sleep(1)

while N < 1000:
  N += 1
  gevent.spawn(test)

gevent.wait()
导入gevent
N=0
def test():
gevent.睡眠(1)
当N<1000时:
N+=1
gevent.spawn(测试)
gevent.wait()

当不使用池生成大量greenlet时,我的程序在两个错误之间交替出现:
gevent.hub.LoopExit:('This operation will block ever'、
Gevent
。在我通过反复试验找到最佳池大小后,所有问题都得到了解决。对我来说,这仍然是不合理的,但我会注意到这是限制并发性的一个优势。此外,我还测量了使用
pool.spawn()
而不是
Gevent.spawn()所花费的总时间
谢谢,我也需要这些信息。不过,凭直觉,我决定运行您的测试变体,让它休眠60秒。休眠期间没有cpu消耗,只有在启动和拆除greenlet期间。启动100000 greenlet实际上执行了相当多的代码,但看起来greenlet没有将所有cpu周期保持在休眠状态。
import gevent

N = 0

def test():
    gevent.sleep(1)

while N < 1000:
  N += 1
  gevent.spawn(test)

gevent.wait()