Spaces:
Runtime error
Runtime error
import gradio as gr | |
import multiprocessing | |
import threading | |
import time | |
import os | |
from math import isqrt | |
# Path to save the primes | |
PRIME_SAVE_PATH = "primes.txt" | |
lock = threading.Lock() # Thread lock to control file access | |
# Function to check if a number is prime | |
def is_prime(n): | |
if n < 2: | |
return False | |
if n in (2, 3): | |
return True | |
if n % 2 == 0 or n % 3 == 0: | |
return False | |
for i in range(5, isqrt(n) + 1, 6): | |
if n % i == 0 or n % (i + 2) == 0: | |
return False | |
return True | |
# Function to find primes in a given range | |
def find_primes_in_range(start, end, queue): | |
primes = [str(num) for num in range(start, end) if is_prime(num)] | |
queue.put(primes) | |
# Function to load previously saved primes | |
def load_saved_primes(): | |
if os.path.exists(PRIME_SAVE_PATH): | |
with open(PRIME_SAVE_PATH, "r") as file: | |
return file.read().splitlines() | |
return [] | |
# Function to save new primes to file | |
def save_primes_to_file(prime_list): | |
with lock: # Ensure only one process writes to the file at a time | |
with open(PRIME_SAVE_PATH, "a") as file: | |
file.write("\n".join(prime_list) + "\n") | |
file.flush() # Ensure data is written to disk | |
os.fsync(file.fileno()) # Force file system to sync | |
# Background prime number generator function | |
def prime_generator(): | |
num = 2 | |
batch_size = 1000 | |
num_processes = multiprocessing.cpu_count() | |
prime_list = load_saved_primes() # Load previously generated primes | |
while True: | |
processes = [] | |
queue = multiprocessing.Queue() | |
# Start multiple processes to find primes in parallel | |
for i in range(num_processes): | |
start = num + i * batch_size | |
end = start + batch_size | |
process = multiprocessing.Process(target=find_primes_in_range, args=(start, end, queue)) | |
process.start() | |
processes.append(process) | |
# Collect primes from all processes | |
all_new_primes = [] | |
for process in processes: | |
process.join() | |
primes = queue.get() | |
all_new_primes.extend(primes) | |
prime_list.extend(all_new_primes) | |
# Save the newly found primes to the file | |
save_primes_to_file(all_new_primes) | |
num += num_processes * batch_size | |
time.sleep(0.1) # Adjust this to control responsiveness and resource usage | |
def start_background_thread(): | |
thread = threading.Thread(target=prime_generator, daemon=True) | |
thread.start() | |
# Function to display the primes in Gradio | |
def display_primes(): | |
prime_list = load_saved_primes() | |
while True: | |
yield "\n".join(prime_list) | |
time.sleep(1) # Refresh interval | |
# Start the background prime number generation | |
start_background_thread() | |
# Gradio Interface | |
interface = gr.Interface( | |
fn=display_primes, # Display function | |
inputs=None, # No inputs required | |
outputs="text", # Output is a text field | |
live=True # Enable live updates | |
) | |
# Launch the interface | |
interface.launch() | |