| 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() |
|
|