2013-10-03 158 views
0

什么是在铁路上只有两列火车(在同一时间)最简单的方法。我的英语不好。这是我如何解释它的唯一方式。我知道我应该使用队列?我在我的语言中找不到信息python队列多线程

谢谢!

1>去,2>去。 3,4wait。 1>完成,3>去(第4仍然等待)..

from threading import Thread 
import time 
import random 

def trains(city): 
    print city, 'start' 

    for count in range(1,3): 
     delay = random.randrange(5,10) 
     print city, 'delay', delay 
     time.sleep(delay) 

    print city, 'end' 


cities = ['prague', 'london', 'berlin', 'moscow'] 
threadlist = [] 

for city in cities:        
    t = Thread(target=trains, args=(city,)) 
    t.start() 
    threadlist.append(t) 


for b in threadlist: 
    b.join() 
+0

听起来像是你想有一个'threading.BoundedSemaphore(2)',但我不明白你的问题不够好,建议实际代码。 –

回答

0

我会在一些事情在这里猜测:

from threading import Thread, Lock, BoundedSemaphore 
import time 
import random 

def trains(city): 
    with railroads: 
     with iolock: 
      print city, 'start' 

     for count in range(1,3): 
      delay = random.randrange(5,10) 
      with iolock: 
       print city, 'delay', delay 
      time.sleep(delay) 

     with iolock: 
      print city, 'end' 


cities = ['prague', 'london', 'berlin', 'moscow'] 
threadlist = [] 

iolock = Lock() 
railroads = BoundedSemaphore(2) 

for city in cities:        
    t = Thread(target=trains, args=(city,)) 
    t.start() 
    threadlist.append(t) 


for b in threadlist: 
    b.join() 

iolock的目的是为了阻止混乱的输出在您的终端中:一次只能打印一个线程。 railroads的目的是允许最多两个线程同时输入代码的主体。这里是示例输出。请注意,“布拉格”和“伦敦”一开始就运行,但“柏林”不会在“伦敦”结束之前开始。然后,“莫斯科”没有启动,直到“布拉格”结尾:

prague start 
london start 
prague delay 8 
london delay 5 
london delay 6 
prague delay 5 
london end 
berlin start 
berlin delay 8 
prague end 
moscow start 
moscow delay 8 
berlin delay 6 
moscow delay 7 
berlin end 
moscow end