69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
import time, signal, random, os, json
|
|
from enum import Enum
|
|
from uuid import UUID, uuid4
|
|
|
|
class JobStatus(Enum):
|
|
QUEUED = 1
|
|
FINISHED = 2
|
|
ERRORED = 3
|
|
|
|
class TimeWaster:
|
|
def __init__(self):
|
|
self.running = True
|
|
self.jobs: list[JobResult] = []
|
|
if (os.path.exists("waster.log")): os.remove("waster.log")
|
|
self.logfd = os.open("waster.log", os.O_CREAT | os.O_WRONLY)
|
|
signal.signal(signal.SIGUSR1, self.handleCancelJob)
|
|
|
|
def handleNewJob(self):
|
|
msg = os.read(0, 1024)
|
|
msgs = msg.decode().split("<END>")
|
|
msgs.pop()
|
|
for message in msgs:
|
|
self.log(f"Got job: \"{message}\"")
|
|
data = json.loads(message)
|
|
self.jobs.append(JobResult(data["ID"], JobStatus.QUEUED, "exists i guess"))
|
|
# os.write(1, self.jobs[jobId])
|
|
|
|
def handleCancelJob(self, signum, stack):
|
|
while (len(self.jobs) > 0):
|
|
canceled: JobResult = self.jobs.pop(0)
|
|
self.log(f"Job Canceled: {canceled.id}")
|
|
self.back = True
|
|
|
|
def quit(self):
|
|
self.running = False
|
|
|
|
def main(self):
|
|
while self.running:
|
|
self.back = False
|
|
if (len(self.jobs) == 0):
|
|
self.handleNewJob()
|
|
else:
|
|
if (self.back): continue
|
|
job: JobResult = self.jobs[0]
|
|
if (self.back): continue
|
|
time.sleep(random.randrange(1, 10) / 10)
|
|
if (self.back): continue
|
|
job.status = JobStatus.FINISHED
|
|
job.result = f"done i guess"
|
|
os.write(1, f"{{\"ID\":{job.id},\"status\":{job.status.value},\"result\":\"{job.result}\"}}<END>".encode())
|
|
self.jobs.remove(job)
|
|
self.log(f"Finished Job: {job.id}")
|
|
|
|
def log(self, msg: str):
|
|
os.write(self.logfd, f"{msg}\n".encode())
|
|
|
|
class JobResult:
|
|
def __init__(self, id: int, status: JobStatus, result) -> None:
|
|
self.id = id
|
|
self.status = status
|
|
self.result = result
|
|
|
|
if __name__ == "__main__":
|
|
TimeWaster().main()
|
|
# while (True):
|
|
# data = os.read(0, 100).decode()
|
|
# print(data)
|
|
# if (data == "QUIT"): break
|