ARF*_*ARF 16 python limit spawning gevent
继续我在评论中回答问题"Gevent pool with nested web requests"的问题:
假设一个人有大量任务,使用gevent.spawn(...)同时生成所有任务是否有任何缺点,而不是使用gevent池和pool.spawn(...)来限制并发数量greenlets?
表达方式不同:即使不是要解决的问题不需要,使用gevent.Pool"限制并发"是否有任何优势?
知道什么会构成这个问题的"大数"吗?
Jor*_*haw 20
处理很多东西时,它只是更干净,也是一种很好的做法.几个星期前我遇到了这个问题,我正在使用gevent spawn来验证一堆针对DNS的电子邮件,大约30k :).
from gevent.pool import Pool
import logging
rows = [ ... a large list of stuff ...]
CONCURRENCY = 200 # run 200 greenlets at once or whatever you want
pool = Pool(CONCURRENCY)
count = 0
def do_work_function(param1,param2):
print param1 + param2
for row in rows:
count += 1 # for logging purposes to track progress
logging.info(count)
pool.spawn(do_work_function,param1,param2) # blocks here when pool size == CONCURRENCY
pool.join() #blocks here until the last 200 are complete
Run Code Online (Sandbox Code Playgroud)
我在测试中发现,当CONCURRENCY大约为200时,我的机器负载将在EC2 m1.small上徘徊在1左右.我有点天真地做了,如果我再次这样做,我会运行多个池并在它们之间休息一段时间,以尝试更均匀地分配NIC和CPU上的负载.
要记住的最后一件事是密切关注您的打开文件,并在需要时增加它:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files.我运行的greenlets每个greenlet占用大约5个文件描述符,所以如果你不小心,你可以很快耗尽.如果您的系统负载高于1,则可能没有用,因为无论如何您都会看到收益递减.
来自谷歌并决定进行一些快速测试,以产生增加的Ngreenlets.分享结果,因为它们可能对其他搜索者有用:
# 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
Run Code Online (Sandbox Code Playgroud)
因此,多达1,000个greenlets并且性能损失很小,但是一旦你开始击中10,000多个greenlets,一切都会变慢.
测试代码:
import gevent
N = 0
def test():
gevent.sleep(1)
while N < 1000:
N += 1
gevent.spawn(test)
gevent.wait()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7705 次 |
| 最近记录: |