-
Notifications
You must be signed in to change notification settings - Fork 0
/
deferredurl.py
62 lines (53 loc) · 1.76 KB
/
deferredurl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
# Name: deferredurl
# Author: jun kimura
# Created: 02/11/2011
# Copyright: (c) jun kimura 2011
# Licence: free
#-------------------------------------------------------------------------------
USAGE = '''
>>> from deferredurl import DeferredUrl
>>> deferred = DeferredUrl()
>>> deferred.set("http://www.google.co.jp")
>>> # Any Process...
>>> content = deferred.get('http://www.google.co.jp')
/* OR */ content = deferred['http://www.google.co.jp']
'''
from threading import Thread, Event
import urllib2
class DeferredUrl(list):
def __init__(self, max_thread=2, timeout=20):
# event for thread max
#self.ev_thread = Event()
self.max_thread = max_thread
self.pool = []
self.timeout = timeout
self.urllist = {}
def set(self, url):
if self.urllist.has_key(url):
return
ev = Event()
self.urllist[url] = {
'event':ev,
'content':None,
}
th = Thread(target=self._worker, args=(url, ev))
self.pool.append(th)
th.daemon = True
th.start()
def get(self, url):
self.urllist[url]['event'].wait()
return self.urllist[url]['content']()
def _worker(self, url, ev):
try:
content = urllib2.urlopen(url, timeout=self.timeout)
except Exception, err:
self.urllist[url]['content'] = lambda:err_handler(err)
else:
self.urllist[url]['content'] = lambda:content.read()
finally:
ev.set()
__getitem__ = get
def err_handler(err):
raise Exception(err)