annotate async_multi_threads/bucket_try_2.py @ 69:551d9fc0a2ba

Updated wrong names.
author June Park <parkjune1995@gmail.com>
date Thu, 25 Dec 2025 20:07:46 -0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
69
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1 # Context
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
2 #
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
3 # Please implement two functions: refillTokenBucket and useTokens. Two classes are already defined: DistributedCache and TokenBucket.
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
4 #
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
5 # refillTokenBucket(user_id): Refill tokens for the specified user's bucket.
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
6 #
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
7 # useTokens(user_id, tokens): Check if there are enough tokens in the specified user's token bucket. If so, update the remaining token count and return true; otherwise, return false. You are required to use instances of the existing classes to implement these functions.
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
8
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
9 import asyncio
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
10 from typing import Dict
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
11
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
12
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
13 class DistributedCache:
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
14
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
15 def __init__(self):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
16 self._hashmap: Dict[str, TokenBucket] = {}
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
17
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
18 def add_user(self, user_id: str):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
19 self._hashmap[user_id] = TokenBucket()
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
20
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
21 def get_token_bucket(self, user_id: str):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
22 return self._hashmap[user_id]
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
23
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
24 class TokenBucket:
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
25
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
26 def __init__(self, initial_token_value: int = 100):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
27 self._tokens = initial_token_value
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
28 self.initial_token_value = initial_token_value
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
29 self._lock = asyncio.Lock()
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
30
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
31 async def consume(self, token: int):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
32 async with self._lock:
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
33 tokens = self.get_token()
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
34 await asyncio.sleep(0.1)
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
35 if tokens < token:
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
36 return False
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
37 tokens -= token
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
38 self.set_token(tokens)
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
39 return True
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
40
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
41 async def refill(self):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
42 async with self._lock:
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
43 self._tokens = self.initial_token_value
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
44
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
45 def get_token(self):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
46 return self._tokens
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
47
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
48 def set_token(self, token: int):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
49 self._tokens = token
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
50
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
51 distCache = DistributedCache()
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
52 distCache.add_user("june")
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
53
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
54 async def refillTokenBucket(user_id: str):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
55 await distCache.get_token_bucket(user_id).refill()
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
56
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
57 async def useTokens(user_id: str, token: int):
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
58 return await distCache.get_token_bucket(user_id).consume(token)
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
59
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
60 async def main():
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
61 await asyncio.gather(useTokens("june", 10), useTokens("june", 10), useTokens("june", 10))
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
62 print(distCache.get_token_bucket("june").get_token())
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
63
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
64 asyncio.run(main())
551d9fc0a2ba Updated wrong names.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
65