क्या वर्तमान गीवेंट प्रक्रिया, और उनमें से राज्य में ग्रीनलेट की संख्या को क्वेरी करने का एक तरीका है?
उदाहरण के लिए, मैं मध्यस्थता वाली ग्रीनलेट्स के साथ मध्यस्थ वेबसाइटों को क्रॉल करना चाहता हूं, फिर मैं क्वेरी के लिए एक और ग्रीनलेट चलाता हूं कि कितने चल रहे हैं कितने समाप्त / अपवाद हैं।
या क्या मुझे काउंटर के रूप में एक वैश्विक चर सेट करना चाहिए? क्या Gvent में बिल्ट-इन जैसा कुछ है?
उत्तर:
उत्तर № 1 के लिए 6Gevent doesn "टी ऐसा कुछ है। लेकिन आप उपयोग कर सकते हैं bool(g)
, g.ready()
तथा g.successful()
इसकी स्थिति की जाँच करने के लिए। मैं इस तरह से ग्रीनलेट्स की स्थिति का सर्वेक्षण करूंगा
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)