2013-10-03 4 views
0

철도에서 2 개의 열차 (동시에)를 갖는 가장 간단한 방법은 무엇입니까? 내 영어가 나쁘다. 이것은 내가 어떻게 설명 할 수있는 유일한 방법이다. 내가 대기열을 사용해야한다는 것을 알고 있습니까? 내 언어로 된 정보를 찾을 수 없습니다.파이썬 큐 멀티 스레딩

Thank you!

> go, 2> go. 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"와 "london"은 처음에는 실행되지만 "berlin"은 "london"이 끝나기 전에 시작되지 않습니다. "프라하는"끝날 때까지 그런 다음 "모스크바"시작되지 않습니다

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 
관련 문제