Python多线程:产生多个线程,只执行最后一个线程

时间:2015-04-01 14:36:44

标签: python multithreading

我正在尝试编写一个非常基本的模拟器,客户端随机到达时间,然后停留一段时间,然后再离开。

这个想法是,每次生成客户端时,都会生成一个单独的线程,其中客户端会在一段随机时间后被删除(请参阅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

我忽略了什么吗?或者是否有更简单的方法来实现我需要的相同功能?

由于

2 个答案:

答案 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,我认为这几乎可以满足您的需求。

相关问题