2013-07-03 2 views
4

Есть ли способ запросить количество зеленых в текущем процессе Gevent и состояние их?Получите общее количество зеленых зелени в Gevent?

Например, я хочу обходить суровые веб-сайты с помощью суровых зеленых, тогда я запускаю еще одну зеленую машину для запроса, сколько из них работает, сколько из них завершено/исключено.

Или мне нужно просто установить глобальную переменную в качестве счетчика? Есть ли у Gevent что-то вроде этого встроенного?

ответ

6

У Gevent нет ничего подобного. Но вы можете использовать bool(g), g.ready() и g.successful(), чтобы проверить его статус. Я хотел бы опросить состояние greenlets таким образом:

import gevent 
import random 

def _get_status(greenlets): 
    total = 0 
    running = 0 
    completed = 0 
    successed = 0 
    yet_to_run = 0 
    failed = 0 

    for g in greenlets: 
     total += 1 
     if bool(g): 
      running += 1 
     else: 
      if g.ready(): 
       completed += 1 
       if g.successful(): 
        successed += 1 
       else: 
        failed += 1 
      else: 
       yet_to_run += 1 

    assert yet_to_run == total - completed - running 
    assert failed == completed - successed 

    return dict(total=total, 
       running=running, 
       completed=completed, 
       successed=successed, 
       yet_to_run=yet_to_run, 
       failed=failed) 

def get_greenlet_status(greenlets): 
    while True: 
     status = _get_status(greenlets) 
     print status 
     if status['total'] == status['completed']: 
      return 
     gevent.sleep(5) 

def crawl(url): 
    r = random.randint(0, 10) 
    gevent.sleep(r) 

    err = random.randint(0, 4) 
    if err == 0: 
     raise Exception 

greenlets = [gevent.spawn(crawl, each) for each in xrange(100)] 

get_greenlet_status(greenlets) 
+1

Очень красиво написано кусок кода @suzanshakya –

+1

, как вы знаете, если его все еще работает или нет? после того, как он готов, если он не будет успешным, вы предполагаете, что он потерпел неудачу. что, если он все еще работает? – ealeon

+0

@ealeon Если 'bool (g)' True, он все еще работает. – suzanshakya