|
import streamlit as st |
|
from time import sleep |
|
import threading |
|
|
|
|
|
class ThreadSafeHashTable: |
|
def __init__(self, size=10): |
|
self.size = size |
|
self.table = [[] for _ in range(size)] |
|
self.locks = [threading.Lock() for _ in range(size)] |
|
|
|
def _hash(self, key): |
|
return hash(key) % self.size |
|
|
|
def put(self, key, value): |
|
index = self._hash(key) |
|
with self.locks[index]: |
|
for i, (k, v) in enumerate(self.table[index]): |
|
if k == key: |
|
self.table[index][i] = (key, value) |
|
return |
|
self.table[index].append((key, value)) |
|
|
|
def get(self, key): |
|
index = self._hash(key) |
|
with self.locks[index]: |
|
for k, v in self.table[index]: |
|
if k == key: |
|
return v |
|
return None |
|
|
|
def delete(self, key): |
|
index = self._hash(key) |
|
with self.locks[index]: |
|
for i, (k, _) in enumerate(self.table[index]): |
|
if k == key: |
|
del self.table[index][i] |
|
return True |
|
return False |
|
|
|
|
|
hash_table = ThreadSafeHashTable(size=10) |
|
|
|
|
|
st.title("Thread-Safe Hash Table Visualization") |
|
|
|
|
|
st.sidebar.header("Operations") |
|
key = st.sidebar.text_input("Key") |
|
value = st.sidebar.text_input("Value") |
|
operation = st.sidebar.selectbox("Operation", ["Put", "Get", "Delete"]) |
|
threads = st.sidebar.slider("Number of Threads", 1, 10, 1) |
|
|
|
|
|
st.header("Hash Table State") |
|
for i, bucket in enumerate(hash_table.table): |
|
st.write(f"Bucket {i}: {bucket}") |
|
|
|
|
|
log = st.empty() |
|
|
|
|
|
if st.sidebar.button("Execute"): |
|
def perform_operation(): |
|
if operation == "Put": |
|
hash_table.put(key, value) |
|
log.write(f"Put key={key}, value={value}") |
|
elif operation == "Get": |
|
result = hash_table.get(key) |
|
log.write(f"Get key={key}, result={result}") |
|
elif operation == "Delete": |
|
result = hash_table.delete(key) |
|
log.write(f"Delete key={key}, success={result}") |
|
|
|
threads_list = [] |
|
for _ in range(threads): |
|
t = threading.Thread(target=perform_operation) |
|
t.start() |
|
threads_list.append(t) |
|
|
|
for t in threads_list: |
|
t.join() |
|
|
|
st.experimental_rerun() |
|
|