繁体   English   中英

获取Gevent中运行greenlet的总数?

[英]Get total number of running greenlets in Gevent?

有没有办法在当前的Gevent过程中查询greenlet的数量,以及它们的状态?

例如,我想用仲裁greenlets抓取任意网站,然后我运行另一个greenlet来查询有多少正在运行的是完成/异常的数量。

或者我应该将全局变量设置为计数器? Gevent有内置的东西吗?

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM