forked from colonelpanic/dotfiles
63 lines
1.6 KiB
Python
63 lines
1.6 KiB
Python
import asyncio
|
|
import random
|
|
import queue
|
|
import requests
|
|
import threading
|
|
|
|
class WebhookHandler(object):
|
|
|
|
def __init__(self, callback_uri='http://whatever'):
|
|
self.queue = queue.Queue()
|
|
self.callback_uri = callback_uri
|
|
|
|
def enqueue(self, webhook_request):
|
|
self.queue.put(webhook_request)
|
|
|
|
def webhook_worker(self):
|
|
while True:
|
|
callback_request = self.queue.get()
|
|
self.run_request(callback_request)
|
|
self.queue.task_done()
|
|
|
|
def flaky_request(self, callback_request):
|
|
random_value = random.random()
|
|
print(random_value)
|
|
if random_value > .9:
|
|
return 500
|
|
r = requests.get(self.callback_uri, params=callback_request)
|
|
return r.status_code
|
|
|
|
def run_request(self, request):
|
|
status_code = self.flaky_request(request)
|
|
if status_code != 200:
|
|
asyncio.run(self.do_retry(callback_request))
|
|
else:
|
|
print("made request")
|
|
|
|
async def do_retry(self, request, delay=1):
|
|
await asyncio.sleep(delay)
|
|
print("Retried request")
|
|
self.run_request(request)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
handler = WebhookHandler(callback_uri="https://www.google.com/")
|
|
thread_count = 10
|
|
for _ in range(1000):
|
|
handler.enqueue({})
|
|
|
|
threads = []
|
|
for _ in range(thread_count):
|
|
thread = threading.Thread(target=handler.webhook_worker, daemon=False)
|
|
thread.start()
|
|
threads.append(thread)
|
|
|
|
for _ in range(1000):
|
|
handler.enqueue({})
|
|
|
|
loop = asyncio.get_event_loop()
|
|
try:
|
|
loop.run_forever()
|
|
finally:
|
|
loop.close()
|