从评论中的“我的问题”转到“问题”。
假设一个人有大量的任务,那么使用gevent.spawn(…)同时生成所有的任务,而不是使用gevent池和pool.spawn(…)来限制并发的greenlet的数量,这有什么缺点吗?
有不同的表述:限制gevent.pool的并发性有什么好处吗,即使问题不需要解决?
知道这个问题的“大数”是什么吗?

最佳答案

在处理很多东西的时候,这只是一种清洁和良好的习惯。几周前我遇到了这个问题,我用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

我在测试中发现,当并发性在200左右时,机器负载将在ec2 m1.small上徘徊在1左右。不过,我做的有点幼稚,如果我再做一次,我会运行多个池,在它们之间睡一段时间,以尝试更均匀地分配NIC和CPU上的负载。
最后要记住的一件事是密切关注打开的文件,如果需要的话增加这些文件的数量:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files。我运行的greenlet每个greenlet大约占用5个文件描述符,所以如果不小心的话,可以很快用完。如果系统负载高于1,这可能没有帮助,因为不管怎样,您都会看到收益递减。

关于python - gevent:产生大量greenlets的缺点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19772530/

10-14 04:42