AmnaHassan commited on
Commit
25f35ab
·
verified ·
1 Parent(s): f994544

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -0
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()