2015-04-01 272 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,))'