スレッドプールの使用


メモ、主にマルチスレッドのスレッドプールを理解して、赤い部分に注目します
プロセス関数が何をしているのか気にしないで、一つの関数として理解すればいい.最後の文はスレッドを解放することだ.
この例では、最大20スレッド、継続的な利用と解放
 
from Queue import Queue
import threading
ThreadPool(object):

    threadQueue = Queue()

    @initialize(max_length=):
        range(max_length):
            ThreadPool.threadQueue.put(threading.Thread())

    @get_thread():
        ThreadPool.threadQueue.get()

    @add_thread(thread_obj):
        ThreadPool.threadQueue.put(thread_obj)
#  
def execute(self):
    result = self.fetch_hosts()
    if not result:
        return None
    
# 
def process(self, hostname, thread_obj):

    try:
        server_response = PluginApi.get_server_info(hostname, self.remote_user, self.remote_port)
        if not server_response.status:
            raise Exception(server_response.message)
        params = urllib.urlencode({"data": json.dumps(server_response.data)})
        #  API , API 
        self.url_request(self.push_resource, 'POST', params)
    except Exception, e:
        log.write_error_log('[%s][process],%s' % (hostname, str(e)))
    finally:
        ThreadPool.add_thread(thread_obj)

そうしないと10000個以上も併発します
リクエスト数、スレッド数、サーバが瞬時にクラッシュする可能性があります.
例:
def run(n):
    print 'run'

for i in range(1000):
    t = threading.Thread(target=run, args=(i,))
    t.start()

この例は瞬時に1000スレッドになります