Добавление и удаление процессов из очереди заданий в Python - PullRequest
0 голосов
/ 27 октября 2019

Моя цель - создать программу, которая имитирует нескольких пользователей, работающих в одной компьютерной системе - создание и завершение процессов (каждый процесс представлен печатной платой). Печатные платы процессов добавляются и удаляются из связанного списка, который имитирует очередь заданий.

До сих пор я сделал следующее: Компьютерная система имеет 5 пользователей. Случайно выбранный пользователь просыпается каждый (случайно выбранный) интервал 1-5 секунд - и создает процесс. То есть пользователь создает объект блока управления процессом (PCB). Созданные печатные платы добавляются в связанный список.

Но теперь я не могу удалить процесс следующим образом: Каждый раз, когда пользователь просыпается, помимо добавления нового процесса, пользователь также удаляет один случайный процесс. из очереди.

Result should be like this:

Random user wakes up;
- User creates new process and adds PCB to a linked list (job queue);
- System sleeps for 1-5 seconds;

Random user wakes up;
- User creates new process and adds PCB to a linked list (job queue);
- User deletes one randomly selected process from job queue;
- System sleeps for 1-5 seconds;

- Random user wakes up;
- User creates new process and adds PCB to a linked list (job queue);
- System sleeps for 1-5 seconds;

- Random user wakes up;
- User creates new process and adds PCB to a linked list (job queue);
- User deletes one randomly selected process from job queue;
- System sleeps for 1-5 seconds;

So far, I have done the following code, in this code only deleting the process has not been implemented.
import time
import asyncio
from datetime import datetime as dt

class User:

    def __init__(self,name):
        self.name = name
        self.processes = []

    def createPCB(self,jobqueue):
        process = PCB(self.name)
        self.processes.append(process)
        jobqueue.addPCBToQueue(process)

    def removeProc(self,jobqueue):
        self.processes.pop(process)
        jobqueue.popProcfromQueue(process)

    def p_count(self):
        return len(self.processes)


class Computer:


    def __init__(self):
        self.queue = []

    def addPCBToQueue(self,process):
        self.queue.append(process)

    def removeProcFromQueue(self,process):
        self.queue.pop(process)

    def count(self):
        return len(self.queue)



class PCB:
    univ_id = 1
    p_count = 0

    def __init__(self,user,state="Running",fframe=-1,lframe=-1):
        self.pid = PCB.univ_id
        self.user = user
        self.state = state
        self.mem = random.randint(20972,41943)
        self.fframe = fframe
        self.lframe = lframe
        self.time = time.ctime()
        PCB.univ_id += 1
        PCB.p_count += 1

class Proc:
    univ_id = 1
    p_count = 0

    def __init__(self,user,state="Running",fframe=-1,lframe=-1):
        self.pid = PCB.univ_id
        self.user = user
        self.state = state
        self.mem = random.randint(20972,41943)
        self.fframe = fframe
        self.lframe = lframe
        self.time = time.ctime()
        PCB.univ_id += 1
        PCB.p_count += 1



async def prtRep():
    global jobqueue
    global users
    last_queue_count = 0
    queue_count = 0
    while jobqueue.count() < 40:
        print("\n")
        print("=====>",time.ctime())
        print("====== Processes Queue Summary ======")
        if jobqueue.count() > 0:
            for user in users:
                print(user.name,": ",user.p_count()," processes")
        print("-------------------------------------")
        print("Total number of processes currently in queue  :",jobqueue.count())
        print("Last created Process ID                       :",jobqueue.queue[-1].pid if jobqueue.count()>0 else 0)
        print("Number of processes created since last report :",jobqueue.count()-last_queue_count)
        print("Number of processes terminated since last report :",jobqueue.count() -queue_count)
        last_queue_count = jobqueue.count()
        print("-------------------------------------")
        await asyncio.sleep(20)
    print("\n")
    print("=====>",time.ctime())
    print("====== Processes Queue Summary ======")
    if jobqueue.count() > 0:
        for user in users:
            print(user.name,": ",user.p_count()," processes")
    print("-------------------------------------")
    print("Total number of processes currently in queue  :",jobqueue.count())
    print("Last created Process ID                       :",jobqueue.queue[-1].pid if jobqueue.count()>0 else 0)
    print("Number of processes created since last report :",jobqueue.count()-last_queue_count)
    print("Number of processes terminated since last report :",jobqueue.count() -queue_count)
    last_queue_count = jobqueue.count()
    print("-------------------------------------")


async def printAllProcesses():
    await prtRep()
    global jobqueue
    print("\n")
    print("========================================== PROCESSES QUEUE DETAILS ===========================================")
    print(time.ctime())
    print("--------------------------------------------------------------------------------------------------------------")

    for process in jobqueue.queue:
        # print("PID:", process.pid,"\tSTATUS:", process.state,"\tUSER:", process.user, "\tMEMORY FRAMES:", process.mem, "\tFIRST FRAME:", process.fframe, "\tLAST FRAME:", process.lframe, "\tSTART TIME:", process.time)
        print("PID: {:<3d} STATUS: {:<10s} USER: {:<7s} MEMORY FRAMES: {:<7d} FIRST FRAME: {:<3d} LAST FRAME: {:<3d} START TIME: {:<26s}".format(process.pid,process.state,process.user,process.mem,process.fframe,process.lframe,process.time))
    print("--------------------------------------------------------------------------------------------------------------")
#async is for threading
async def main():
    while PCB.p_count < 40:

        r_sec = random.randint(1,5)
        r_user = random.randint(0,4)


        await asyncio.sleep(r_sec)
        users[r_user].createPCB(jobqueue)

    while PCB.p_count < 40:

        r_sec = random.randint(1,5)
        r_user = random.randint(0,4)

        await asyncio.sleep(r_sec)
        users[r_user].removeProc(jobqueue)

#list,dictionary,tupple.
users = []
users.append(User("u1"))
users.append(User("u2"))
users.append(User("u3"))
users.append(User("u4"))
users.append(User("u5"))

jobqueue = Computer()

loop = asyncio.get_event_loop()
task1 = loop.create_task(main())
task2 = loop.create_task(printAllProcesses())
try:
    print("\nUsers starting to create processes.. updates every 20 seconds")
    loop.run_until_complete(asyncio.gather(task1,task2))
except:
    pass```
...