У 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)
Очень красиво написано кусок кода @suzanshakya –
, как вы знаете, если его все еще работает или нет? после того, как он готов, если он не будет успешным, вы предполагаете, что он потерпел неудачу. что, если он все еще работает? – ealeon
@ealeon Если 'bool (g)' True, он все еще работает. – suzanshakya