Ich versuche, eine Aufzugssimulation wegen eines interessanten Problems zu machen, das ich auf CareerCup sah. Mein Problem ist, dass ich möchte, dass der Fahrstuhl "Zeit braucht", um von einem Stockwerk zum nächsten zu gelangen. Im Moment wird es sofort in die nächste Etage in seiner Liste "zu Besuch" verschoben. Ich bin mir nicht sicher, wie ich es programmieren soll, damit "Abholungsanfragen" kommen können, während sich der Aufzug bewegt. Ich denke, das erfordert Threading und die Funktion time.sleep(). Wie mache ich einen Thread, der zufällige Anfragen an den Aufzug stellt, und einen anderen Thread, bei dem der Aufzug versucht, alle Anfragen zu erfüllen? Dies ist, was ich bisher habe:Python Threading für Aufzug Simulation
import time
from random import *
import math
class Elevator:
def __init__(self, num_floors):
self.going_up = False
self.going_down = False
self.docked = True
self.curr_floor = 0
self.num_floors = num_floors
self.floors_to_visit = []
self.people_waiting = []
def print_curr_status(self):
for i in range(self.num_floors):
if i == self.curr_floor:
print('. []')
else:
print('.')
print ("to_visit: ", self.floors_to_visit)
def handle_call_request(self, person):
if not self.going_up and not self.going_down:
self.floors_to_visit = [person.curr_floor] + self.floors_to_visit
self.going_up = True
self.docked = False
self.people_waiting.append(person)
else:
self.floors_to_visit.append(person.curr_floor)
self.people_waiting.append(person)
def handle_input_request(self, floor_num):
self.floors_to_visit.append(floor_num)
def go_to_next(self):
if not self.floors_to_visit:
self.print_curr_status()
return
self.curr_floor = self.floors_to_visit.pop(0)
for i,person in enumerate(self.people_waiting):
if person.curr_floor == self.curr_floor:
person.riding = True
person.press_floor_num()
self.people_waiting.pop(i)
return
class Person:
def __init__(self, assigned_elevator, curr_floor):
self.curr_floor = curr_floor
self.desired_floor = math.floor(random() * 10)
self.assigned_elevator = assigned_elevator
self.riding = False
def print_floor(self):
print(self.desired_floor)
def call_elevator(self):
self.assigned_elevator.handle_call_request(self)
def press_floor_num(self):
self.assigned_elevator.handle_input_request(self.desired_floor)
my_elevator = Elevator(20)
while True:
for i in range(3):
some_person = Person(my_elevator, math.floor(random() * 10))
some_person.call_elevator()
my_elevator.go_to_next()
my_elevator.print_curr_status()
time.sleep(1)
Es ist nicht schwer, überhaupt zu tun, Sie können Python-Threads verwenden, damit sie perfekt funktionieren. Die Tatsache, dass sie das preemptive Threading des Interpreters verwenden, spielt hier keine Rolle. – spectras
Es hängt davon ab, wie Sie es tun. –
Sicher, es ist immer möglich, Dinge schwieriger zu machen, als sie sein sollten. – spectras