2013-05-10 87 views
2

我一直對我被分配做一個項目。它是關於某種停車場的地方是進入汽車,是爲了以後是全自動(完成)現在,我已經把他們變成了「等待名單(因爲我有一個GUI模塊後表示它們)產生分配在停車場的一個地方。然後他們必須走出停車場(也隨機)如何在python中同時運行多個循環函數?

當我創建了一個將始終創建汽車隨機,現在我不能調用任何其它功能,因爲第一個是循環的功能的問題提出。

的問題是,有沒有辦法來調用幾個循環功能在同一時間?

感謝

+2

嘗試使用線程模塊http://docs.python.org/2/library/threading.html。但要小心GIL http://wiki.python.org/moin/GlobalInterpreterLock – Pramod 2013-05-10 17:41:41

+1

除非整個模擬受CPU限制,否則沒有特別的理由要「小心GIL」。大多數情況下,線程對於諸如停車場問題的模擬非常有效。 – 2013-05-10 18:02:43

回答

0

也許導入random,然後設置你希望某些事件發生的範圍內?

def mainLoop(): 
    while True: 
     x = random.randrange(1,100) 
     if 0>x>10: do something() 
     if 10>x>60: do somethingMoreFrequently() 
     if 60>x>61: do somethingRarely() 

諸如此類

如果你從字面上要同時調用幾個循環功能要準備學習一下線程。線程很難,除非100%必要,否則我絕不會這麼做。

但是這應該足夠簡單,以實現無

0

不要同時擁有無限循環,有那麼每做,如果需要工作,返回(或可能的產量)。然後讓你的主事件循環調用兩者。事情是這樣的:

def car_arrival(): 
    if need_to_generate_car: 
     # do car generation stuff 
    return 

def car_departure() 
    if time_for_car_to_leave: 
     # do car leaving stuff 
    return 


def event_loop(): 
    while sim_running: 
     car_arrival() 
     car_departure() 
     sleep(0.5) 
+0

謝謝!我想我會試試這個。事情是,如果隨機設置下一輛車未來一小時的功能恰好在0秒內產生下一個功能,並且如果整個週期尚未完成,該計劃永遠不會最終創造汽車。但是,我認爲我可以解決特定的問題:)謝謝! – 2013-05-10 18:38:41

1

的問題是,有沒有辦法來調用幾個循環功能在同一時間?

這是一個很好的問題,有幾種方法可以做到這一點。

Threading可以讓你的功能同時運行。線程之間的數據流應該使用Queue module管理:

# Inter-thread communication 
wait_to_park = Queue() 
wait_to_exit = Queue() 

# Start the simulation 
tg = threading.Thread(target=generate_cars) 
tp = threading.Thread(target=park_cars) 
tu = threading.Thread(target=unpark_cars) 
tg.start(); tp.start(); tu.start() 

# Wait for simumlation to finish 
tg.join() 
wait_to_park.join() 
tp.join() 
wait_to_exit.join() 
tu.join() 

或者,您也可以使用事件循環,如sched module協調的事件。 Generators可能對此有所幫助 - 它們的功能類似於可以暫停和重新啓動的功能。

+1

感謝您的回答雷蒙德!我一直想弄明白,因爲我想學習如何使用這個線程模塊。 在你建議的代碼中,例如wait_to_park,wait_to_exit,generate_cars等都是previeusly聲明的函數嗎? – 2013-05-10 18:29:39