Skip to content

Instantly share code, notes, and snippets.

@ghoseb
Created July 27, 2011 09:27
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save ghoseb/1109003 to your computer and use it in GitHub Desktop.
Save ghoseb/1109003 to your computer and use it in GitHub Desktop.
Gevent spawn / link example
from gevent import monkey; monkey.patch_all()
import gevent
import gevent.greenlet
from functools import partial
from random import random
import urllib
import urllib2
def on_exception(fun, greenlet):
"""Receiver in case of an error
"""
print "Oops! Restarting..."
fun()
def fetch_url(url):
"""Fetch an URL, sleep for some time and repeat. Die occasionally to emulate failure
"""
while True:
r = random()
if r < 0.3:
print "Raising an exception!"
raise Exception("Time to die :(")
data = urllib2.urlopen(url).read()
print "Fetched %s..." % url
gevent.sleep(r)
def main(urls):
gs = [gevent.spawn(fetch_url, url) for url in urls]
x = [g.link_exception(partial(on_exception, partial(main, urls))) for g in gs]
gevent.joinall(gs)
if __name__ == '__main__':
print main(["http://google.co.il", "http://google.com"])
@liushuaikobe
Copy link

When one greenlet raise an Exception, all greenlets will be restarted, is this reasonable?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment