2015-04-01 264 views
0

我正試圖編寫一個非常基本的模擬器,客戶端隨機到達時間到達,然後停留一段隨機時間,然後再次離開。Python多線程:產生多個線程,只執行最後一個執行

這個想法是,每次生成客戶端時,會在隨機時間後刪除客戶端(請參閱delete_user()函數)後生成一個單獨的線程。

def delete_user(user): 
    time.sleep(random.randint(5,20)) 
    print "User %s left at %s" % (user.id, time.ctime()) 

def start_simulation(number_users, interval): 
    for i in range(number_users): 
     t = random.expovariate(1.0/interval) 
     time.sleep(t) # wait random time before generating a new user 
     user = generate_user() 
     print "User %s generated at %s" % (user.id, time.ctime()) 
     worker = threading.Thread(target=delete_user, args=(user,)) 
     worker.start() 

問題是,delete_user()只執行一次,對於生成的最後一個用戶。似乎只有最後產生的線程實際上做了某些事情。

這是輸出:

User b490fbd0-8740-4d7e-a3a6-d46449ff918b generated at Wed Apr 1 07:22:47 2015 
User 844122d9-4032-4866-9e07-eb86f076a531 generated at Wed Apr 1 07:22:49 2015 
User 91e238fc-4ed1-4a81-a434-9a50d3b01fed generated at Wed Apr 1 07:22:52 2015 
User 877c8e3f-2b3d-4997-9644-98d078388427 generated at Wed Apr 1 07:22:52 2015 
User a77dcefc-8ea1-467d-8365-923b789ab4bb generated at Wed Apr 1 07:22:54 2015 
User a77dcefc-8ea1-467d-8365-923b789ab4bb left at Wed Apr 1 07:23:02 2015 

我俯瞰的東西嗎?還是有更簡單的方法來實現我需要的相同功能?

感謝

+0

難道你們就不能只是隨機繪製的開始時間和時間的長短,他們都存在然後隨着時間的推移而循環,這將執行當時發生的任何操作? – user2539336 2015-04-01 14:43:14

+0

是的,我正在考慮做那樣的事情。但是,對於'隨着時間的流逝'來說,你究竟意味着什麼?你是說我應該睡一秒,醒來,檢查是否應該完成一個事件,然後再睡一會兒? – HaS 2015-04-01 14:52:23

+0

這將是一種方法來做到這一點(當然我在想什麼),但一個快速谷歌已經出現這個:https://docs.python.org/2/library/sched.html,我認爲幾乎你想要的東西 – user2539336 2015-04-01 14:54:23

回答

1

我相當肯定你不能定義多個具有相同變量名的線程反覆。每次你重新定義它時,你都取消了最後一個線程,並且這些線程在5到20秒內運行,當然你的for循環不會等那麼長時間才能創建一個新的線程。也許你應該嘗試類似Scheduling模塊。

「邪惡」替代,不同之處在於,你不能叫Thread.cancel():

exec(str(random.random) + ' = threading.Thread(target=delete_user, args=(user,))'