#!/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)