처리해야할 태스크가 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) |