我正在尝试编写一个非常基本的模拟器,客户端随机到达时间,然后停留一段时间,然后再离开。
这个想法是,每次生成客户端时,都会生成一个单独的线程,其中客户端会在一段随机时间后被删除(请参阅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 :(得分:1)
我相当确定你不能一遍又一遍地定义具有相同变量名的多个线程。每次重新定义它都会取消最后一个线程,并且线程在5到20秒之间运行,当然你的for循环不会等待那么长时间来创建一个新线程。也许你应该尝试类似Scheduling
模块的东西。
" Evil" 替代方案,但您无法调用Thread.cancel():
exec(str(random.random) + ' = threading.Thread(target=delete_user, args=(user,))'
答案 1 :(得分:-2)
从评论部分移开:
一个快速谷歌已经出现了这个:http://docs.python.org/2/library/sched.html,我认为这几乎可以满足您的需求。