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