2009-06-11 4 views
2

Pyglet에 GUI 응용 프로그램을 작성 중이며 인터넷에서 수십에서 수백 개의 미리보기 이미지를 표시해야합니다. 지금 당장은 urllib.urlretrieve을 사용하고 있지만, 끝날 때까지 매번 차단되어 한 번에 하나씩 만 잡습니다.Python에서 비 차단 URL 가져 오기를 수행하는 방법

언제든지 GUI를 차단하지 않고 병렬로 다운로드하여 완료하자 마자 표시되도록하는 것이 좋습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

스레드에 대해 많이 알지는 못하지만, threading 모듈이 도움이 될 것 같습니다. 아니면 간과 한 쉬운 방법이있을 것입니다.

답변

3

당신은 아마 threading 또는 multiprocessing 모듈 혜택을 얻을 것입니다. 당신이 중 하나가 스레드를 사용할 필요가

from multiprocessing import Pool 

def fetch_url(url): 
    # Fetch the URL contents and save it anywhere you need and 
    # return something meaningful (like filename or error code), 
    # if you wish. 
    ... 

pool = Pool(processes=4) 
result = pool.map(f, image_url_list) 
+0

스레드 풀과 동일한 풀이 있습니까? 이것은 내가 필요로하는 것보다 더 무거운 별도의 프로세스를 실행하는 것처럼 보입니다. – Kiv

+0

내장이없는 것 같지만, 이것을 발견했습니다 : http://www.chrisarndt.de/projects/threadpool/ 그리고 꽤 유사합니다. – drdaeman

+0

고마워, threadpool 잘하고있다. – Kiv

2

의심 스러울 때, 이것은 스레딩에 적합한 상황입니다. Here은 파이썬에서 처음으로 스레드 스레딩을 할 때 매우 도움이되는 짧은 안내서입니다.

2

당신이 올바르게 지적한대로, 스레드 수를 만들면 각 스레드가 urlretrieve 작업을 수행 할 수 있습니다. 이렇게하면 주 스레드가 중단없이 계속 사용할 수 있습니다. http://heather.cs.ucdavis.edu/~matloff/Python/PyThreads.pdf

+0

튜토리얼을 이용해 주셔서 감사합니다. – Kiv

2

여기 threading.Thread을 사용하는 방법의 예 : 여기

는 파이썬에서 스레딩에 대한 자습서입니다. 클래스 이름을 자신의 이름으로 바꾸고 실행 기능을 직접 바꿉니다. 스레딩은 자신의 것과 같은 IO 제한된 응용 프로그램에 적합하며 실제로 속도를 높일 수 있습니다. python 쓰레드를 엄격하게 표준 파이썬에서 계산하는 것은 도움이되지 않습니다. 왜냐하면 한 번에 하나의 쓰레드 만 계산할 수 있기 때문입니다.

import threading, time 
class Ping(threading.Thread): 
    def __init__(self, multiple): 
     threading.Thread.__init__(self) 
     self.multiple = multiple 
    def run(self): 
     #sleeps 3 seconds then prints 'pong' x times 
     time.sleep(3) 
     printString = 'pong' * self.multiple 

pingInstance = Ping(3) 
pingInstance.start() #your run function will be called with the start function 
print "pingInstance is alive? : %d" % pingInstance.isAlive() #will return True, or 1 
print "Number of threads alive: %d" % threading.activeCount() 
#main thread + class instance 
time.sleep(3.5) 
print "Number of threads alive: %d" % threading.activeCount() 
print "pingInstance is alive?: %d" % pingInstance.isAlive() 
#isAlive returns false when your thread reaches the end of it's run function. 
#only main thread now 
0

, 또는 Twisted와 같은 비동기 네트워킹 라이브러리 : 당신은 실제로 자신이 모든 Thread 기반 클래스를 만들 필요가 없습니다, Pool.map를 사용하여 간단한 방법이있다. 나는 당신의 특정 유스 케이스에서 쓰레드를 사용하는 것이 더 간단 할 것이라고 생각한다.

1

는 이러한 선택 사항이 있습니다

  • 스레드 : 가장 쉬운하지만 잘
  • 트위스트를 확장하지 않습니다 매체 어려움으로 인해 GIL과 단일 스레드를 복지 만 공유 CPU 확장 할 수 있습니다.
  • 다중 처리 : 가장 힘들다. 자신 만의 이벤트 루프를 작성하는 방법을 알고 있으면 확장이 잘됩니다.

산업 규모의 가져 오기 도구가 필요하지 않으면 스레드를 사용하는 것이 좋습니다.

관련 문제