import sys if sys.version_info >= (3,): import queue from urllib.request import Request, urlopen else: import Queue as queue from urllib2 import Request, urlopen import resource import multiprocessing def process(f): heap_size=10*1024*1024 q = multiprocessing.Queue() def newf(f, q): rsrc = resource.RLIMIT_DATA resource.setrlimit(rsrc, (heap_size, heap_size)) try: r = f() q.put(r) except Exception as e: q.put(e) p = multiprocessing.Process(target=newf, args=(f, q)) p.start() p.join() try: v = q.get(block=False) except queue.Empty: assert False finally: q.close() if isinstance(v, Exception): raise v else: return v def fetch_sandbox(f): def newf(): replies = process(f) assert replies == 'ok', replies return newf @fetch_sandbox def fetch(): url = 'http://python.org/' request = Request(url) fd = urlopen(request) return 'ok' fetch()