Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from time import sleep
|
3 |
+
import threading
|
4 |
+
|
5 |
+
# Thread-safe hash table class
|
6 |
+
class ThreadSafeHashTable:
|
7 |
+
def __init__(self, size=10):
|
8 |
+
self.size = size
|
9 |
+
self.table = [[] for _ in range(size)]
|
10 |
+
self.locks = [threading.Lock() for _ in range(size)]
|
11 |
+
|
12 |
+
def _hash(self, key):
|
13 |
+
return hash(key) % self.size
|
14 |
+
|
15 |
+
def put(self, key, value):
|
16 |
+
index = self._hash(key)
|
17 |
+
with self.locks[index]: # Thread-safe lock
|
18 |
+
for i, (k, v) in enumerate(self.table[index]):
|
19 |
+
if k == key:
|
20 |
+
self.table[index][i] = (key, value)
|
21 |
+
return
|
22 |
+
self.table[index].append((key, value))
|
23 |
+
|
24 |
+
def get(self, key):
|
25 |
+
index = self._hash(key)
|
26 |
+
with self.locks[index]:
|
27 |
+
for k, v in self.table[index]:
|
28 |
+
if k == key:
|
29 |
+
return v
|
30 |
+
return None
|
31 |
+
|
32 |
+
def delete(self, key):
|
33 |
+
index = self._hash(key)
|
34 |
+
with self.locks[index]:
|
35 |
+
for i, (k, _) in enumerate(self.table[index]):
|
36 |
+
if k == key:
|
37 |
+
del self.table[index][i]
|
38 |
+
return True
|
39 |
+
return False
|
40 |
+
|
41 |
+
# Initialize the hash table
|
42 |
+
hash_table = ThreadSafeHashTable(size=10)
|
43 |
+
|
44 |
+
# Streamlit app
|
45 |
+
st.title("Thread-Safe Hash Table Visualization")
|
46 |
+
|
47 |
+
# Sidebar for inputs
|
48 |
+
st.sidebar.header("Operations")
|
49 |
+
key = st.sidebar.text_input("Key")
|
50 |
+
value = st.sidebar.text_input("Value")
|
51 |
+
operation = st.sidebar.selectbox("Operation", ["Put", "Get", "Delete"])
|
52 |
+
threads = st.sidebar.slider("Number of Threads", 1, 10, 1)
|
53 |
+
|
54 |
+
# Main area
|
55 |
+
st.header("Hash Table State")
|
56 |
+
for i, bucket in enumerate(hash_table.table):
|
57 |
+
st.write(f"Bucket {i}: {bucket}")
|
58 |
+
|
59 |
+
# Log area
|
60 |
+
log = st.empty()
|
61 |
+
|
62 |
+
# Perform operation
|
63 |
+
if st.sidebar.button("Execute"):
|
64 |
+
def perform_operation():
|
65 |
+
if operation == "Put":
|
66 |
+
hash_table.put(key, value)
|
67 |
+
log.write(f"Put key={key}, value={value}")
|
68 |
+
elif operation == "Get":
|
69 |
+
result = hash_table.get(key)
|
70 |
+
log.write(f"Get key={key}, result={result}")
|
71 |
+
elif operation == "Delete":
|
72 |
+
result = hash_table.delete(key)
|
73 |
+
log.write(f"Delete key={key}, success={result}")
|
74 |
+
|
75 |
+
threads_list = []
|
76 |
+
for _ in range(threads):
|
77 |
+
t = threading.Thread(target=perform_operation)
|
78 |
+
t.start()
|
79 |
+
threads_list.append(t)
|
80 |
+
|
81 |
+
for t in threads_list:
|
82 |
+
t.join()
|
83 |
+
|
84 |
+
st.experimental_rerun()
|