쓰레드 묶음으로 처리하기..
처리해야할 태스크가 100여개 있는데, 이것을 3개씩 처리하고 싶은 경우가 있습니다. 이럴때는 쓰레드 생성 함수를 루핑 돌리면서 처리해주면 됩니다.
아래 소스는 Practical threaded programming with Python 를 기반으로 작성되었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = "sbhyun" __date__ = "2015. 11. 21" import Queue import threading import urllib2 import time ''' 작업 내역 ''' hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com", "http://ibm.com", "http://apple.com", ] queue = Queue.Queue() MAX_THREAD = 3 class ThreadUrl(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): while True: ''' 큐에서 작업내역을 가지고 옴 ''' host = self.queue.get() # 여기부터 쓰레드로 처리할 로직을 넣으면 됨. url = urllib2.urlopen(host) print url.read(1024) # 쓰레드 로직 끝 ''' 큐 작업 완료 처리 호출 ''' self.queue.task_done() def beginThread(hosts=None): ''' 쓰레드를 만들고 실행하는 function ''' if hosts is None: print "hosts variable is empty!" return None ''' 큐에 쓰레드에서 처리할 자료를 넣음''' for host in hosts: queue.put(host) ''' MAX_THREAD 값 만큼 Thread 를 생성 1024 이상을 처리할 수 없다. ''' for i in range(MAX_THREAD): t = ThreadUrl(queue) t.setDaemon(True) t.start() queue.join() def main(): ''' 기본 아이디어는 처리할 많은 자료를 MAX_THREAD 에서 정의한 만큼씩만 가지고 와서 그 수만큼 Thread 를 만들고 처리 하도록 함. ''' sliceHosts = [] try: for i in range(MAX_THREAD): if hosts: ''' pop 함수를 쓰면 리스트에서 값을 가지고 옴과 동시에 List 에서 값을 지워준다. ''' result = hosts.pop() ''' pop 으로 가지고 온값을 임시 리스트에 넣어준다. 이 임시변수는 Thread 에게 사용할 데이터이며 생성할 Thread 개수만큼 값을 갖는다 ''' sliceHosts.append(result) except IndexError: pass ''' Thread 실행 ''' beginThread(sliceHosts) ''' 쓰레드가 완료되면 기존 리스트는 삭제처리 ''' del(sliceHosts) ''' 아직 처리할 데이터가 리스트에 남았다면 더 처리할 거냐고 물어본다 ''' if hosts: answer = raw_input( "target value remains in the list. Do you continue? (yes/no) ") ''' 대답이 yes 면 다시 실행 ''' if answer == 'yes': main() if __name__ == '__main__': start = time.time() main() print "Elapsed Time: %s" % (time.time() - start) |