blob: 1b3b6afcd8f45b15da0482c773637ae34b4e404c [file] [log] [blame]
Joe Gregorio0c73a672010-10-14 08:27:59 -04001from apiclient.discovery import build
2from apiclient.discovery import HttpError
3
4import Queue
5import httplib2
6import pickle
7import threading
8import time
9
10# Uncomment to get detailed logging
11# httplib2.debuglevel = 4
12
13
14NUM_THREADS = 4
15NUM_ITEMS = 40
16
17queue = Queue.Queue()
18
19
20class Backoff:
21 """Exponential Backoff
22
23 Implements an exponential backoff algorithm.
24 """
25 def __init__(self, maxretries=8):
26 self.retry = 0
27 self.maxretries = maxretries
28 self.first = True
29
30 def loop(self):
31 if self.first:
32 self.first = False
33 return True
34 else:
35 return self.retry < self.maxretries
36
37 def fail(self):
38 self.retry += 1
39 delay = 2**self.retry
40 time.sleep(delay)
41
42
43def start_threads(credentials):
44 # Start up NUM_THREADS to handle requests
45
46 def process_requests():
47 http = httplib2.Http()
48 http = credentials.authorize(http)
49
50 while True:
51 request = queue.get()
52 backoff = Backoff()
53 while backoff.loop():
54 try:
55 request.execute(http)
56 break
57 except HttpError, e:
58 if e.resp.status in [402, 403, 408, 503, 504]:
59 print "Increasing backoff, got status code: %d" % e.resp.status
60 backoff.fail()
61
62 print "Completed request"
63 queue.task_done()
64
65 for i in range(NUM_THREADS):
66 t = threading.Thread(target=process_requests)
67 t.daemon = True
68 t.start()
69
70def main():
71
72 f = open("moderator.dat", "r")
73 credentials = pickle.loads(f.read())
74 f.close()
75
76 start_threads(credentials)
77
78 http = httplib2.Http()
79 http = credentials.authorize(http)
80
81 p = build("moderator", "v1", http=http)
82
83 series_body = {
Joe Gregorio913e70d2010-11-05 15:38:23 -040084 "data": {
85 "description": "An example of bulk creating topics",
86 "name": "Using threading and queues",
87 "videoSubmissionAllowed": False
88 }
Joe Gregorio0c73a672010-10-14 08:27:59 -040089 }
90 series = p.series().insert(body=series_body).execute()
91 print "Created a new series"
92
93 for i in range(NUM_ITEMS):
94 topic_body = {
95 "data": {
96 "description": "Sample Topic # %d" % i,
97 "name": "Sample",
98 "presenter": "me"
99 }
100 }
101 topic_request = p.topics().insert(seriesId=series['id']['seriesId'], body=topic_body)
102 print "Adding request to queue"
103 queue.put(topic_request)
104
105 queue.join()
106
107
108if __name__ == "__main__":
109 main()