2013-05-10 622 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