スレッドプールの使用
1493 ワード
メモ、主にマルチスレッドのスレッドプールを理解して、赤い部分に注目します
プロセス関数が何をしているのか気にしないで、一つの関数として理解すればいい.最後の文はスレッドを解放することだ.
この例では、最大20スレッド、継続的な利用と解放
そうしないと10000個以上も併発します
リクエスト数、スレッド数、サーバが瞬時にクラッシュする可能性があります.
例:
この例は瞬時に1000スレッドになります
プロセス関数が何をしているのか気にしないで、一つの関数として理解すればいい.最後の文はスレッドを解放することだ.
この例では、最大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スレッドになります