2014-02-18 35 views
0

我正在嘗試創建一個模擬商店結帳的程序。我允許用戶輸入一堆數據,然後將它們傳遞到運行模擬的函數中。我正在使用我創建的Queue類,併爲我需要的(FIFO)工作。當我試圖讓客戶端進入到一個開放的服務器的隊列中,然後最終從隊列中刪除時,我的問題就出現了。一旦消失,服務器將從隊列中選擇下一個客戶端,依此類推。Python簽出模擬

下面是我的就是我有這麼遠代碼..

from queue_array import Queue 
from customer import Customer 
from server import Server 

import random, copy 

def line_up (total_time, num_servers, max_num_clients_per_min, max_service, min_service, freakout_chance, min_freak, max_freak): 
    q = Queue() 
    s = [] 
    customer_id = 0 
    server_id = 0 
    max_queue_size = 0 
    serving = 0 
    customers_served = 0 
    is_serving = False 


    for _se in range(num_servers): 
     server = Server(server_id, None) 
     s.append(server)  
     server_id += 1 
    #loop through each minute 
    for time in range(0, total_time + 1): 
     print ("Time = {}".format(time)) 

     num_join = random.randint(0, max_num_clients_per_min) 

     #Determine when customer joins the queue 
     for _i in range(0, num_join): 
      print (" Client {} joins the queue.".format(customer_id)) 
      service_length = random.randint(min_service, max_service) 
      f = random.randint(1, freakout_chance) 
      if f == 1: 
       freak = True 
      else: 
       freak = False 

      customer = Customer(customer_id, copy.deepcopy(time), service_length, freak) 
      q.insert(customer) 
      customer_id += 1 

      if len(q) > max_queue_size: 
       max_queue_size = len(q) 

     for serve in s: 
      if serve.client is None: 
       n = serve.number 
       print (" Server {} starting to serve Client {}".format(n, q.peek().number)) 

line_up(5, 3, 2, 5, 1, 1000, 0, 5) 

所以這裏這個代碼呼籲我的Queue類藏漢爲我做了一些其他的小課程。我不包括他們,因爲我不認爲我需要將他們包括在我需要幫助的東西中。

我的問題是,我如何獲得已放入列表的服務器,以便每次一個客戶端從隊列中取出一個客戶端,然後一旦他們完成服務,將它們從隊列中移除並採取下一個。

我希望我很清楚,請評論,如果你需要更多的澄清。

回答

1

由於您還沒有發佈您的隊列代碼,所以很難確定,但只要服務器已準備就緒,您就應該從隊列中移除客戶,以防止多個服務器分配給同一個客戶:

for serve in s: 
    if serve.client is None: 
     serve.client = q.remove() # or pop or whatever you have 
     print (" Server {} starting to serve Client {}".format(serve.number, serve.client.number))