GEvent:催生大量绿皮书的不利因素是什么?

2022-04-10 00:00:00 python limit gevent spawning

问题描述

从我在评论中的问题到this answer到问题"Gevent pool with nested web requests":

假设一个人有大量的任务,使用gvent.spawn(...)同时生成所有它们,而不是使用GEvent池和pool.spawn(...)要限制并发小纸币的数量?

换一种说法:即使要解决的问题不是必需的,但对gvent.pool进行"限制并发"有什么好处吗?

你知道什么是这个问题的"大数字"吗?


解决方案

在处理很多事情时,它更干净,也是一种很好的做法。几周前,我遇到了这种情况,当时我正在使用GEVENT SPOWN根据30K:)数量级的DNS来验证一堆电子邮件。

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

我在测试中发现,当并发数为200左右时,我的机器负载将在EC2 m1.mall上徘徊在1左右。不过,我这样做有点天真,如果我要再次这样做,我会运行多个池,并在它们之间休眠一段时间,以尝试更均匀地分配NIC和CPU上的负载。

要记住的最后一件事是关注打开的文件,并在需要时增加打开的文件:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files。我运行的greenlet占用了每个greenlet大约5个文件描述符,所以如果您不小心的话可能很快就会用完。如果您的系统负载高于1,这可能没有帮助,因为无论如何,您都会开始看到收益递减。

相关文章