2017-06-17 43 views
0

由于我在CareerCup上看到一个有趣的问题,我正在尝试进行电梯模拟。我的问题是,我想让电梯“花费时间”从一层移动到另一层。现在它立即移动到“访问”列表中的下一个楼层。我不确定如何编程,以便在电梯移动时可以接入“取件请求”。我认为这可能需要线程和time.sleep()函数。我如何使一个线程向电梯发出随机请求,另一个线程使电梯试图满足所有请求?这是我到目前为止:用于电梯模拟的蟒蛇线程

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) 

回答

-2

您将需要一次有两个线程。一个用于随机请求,另一个用于满足这些请求。 python很难做到这一点,因为它是一个单线程程序。但是,您可以有一个等待请求的已定义函数,然后将请求保存到文件中。然后它会运行另一个定义的任务,它将响应这些请求。然后,当处理请求时,然后运行其他定义的函数并等待另一个请求。

+0

这是不难在所有做,你可以使用python线程,因为他们将完美工作。他们在翻译中使用抢先式线程这一事实根本就不重要。 – spectras

+0

这取决于你如何做到这一点。 –

+0

当然,总是有可能让事情变得比他们应该更努力。 – spectras

0

没有任何线索是必要的。您可以引入2个新变量:一个记录电梯启动的时间,另一个记录乘坐电梯的时间。然后只需检查电梯何时运行足够长时间。你可以这样做,调用函数time.time();它会自1970年1月1日以秒为单位返回时间(因为您只关心差异无关紧要,您只需要一个时间递增的函数)。虽然这个功能通常不能给出比1秒更精确的时间段。如果你觉得你的机器不准确,那么你可以使用datetime

class Elevator: 
    def __init__(self, num_floors): 
     self.start_time = 0 
     self.ride_duration = 1 
     ... 

    def call_elevator(self): 
     self.start_time = time.time() 
     self.assigned_elevator.handle_call_request(self) 

    def go_to_next(self): 
     if time.time() - self.start_time < self.ride_duration: 
      return # Do nothing. 
     else: 
      ... 

你可能需要重构的代码,以满足您的需求,加上当电梯在使用中怎样做一些逻辑等