クールで簡単な Web クローラーを開発するためにスレッド化について調べていますが、動作が非常に遅いです。
これは、 ibm ライブラリーで見つけたコードの断片です。
urls = [] # huge list of urls
in_queue = Queue.Queue()
out_queue = Queue.Queue()
pool = ActivePool()
s = threading.Semaphore(semaphore)
for url in urls[:slice_size]:
in_queue.put(url)
t = ThreadUrl(pool, s, url, in_queue, out_queue)
t.setDaemon(True)
t.start()
counter = slice_size
while not in_queue.empty() or not out_queue.empty():
speed_new_daemon = time.time()
url = urls[counter]
in_queue.put(url)
t = ThreadUrl(pool, s, url, in_queue, out_queue)
t.setDaemon(True)
t.start() # <------ why 20% of all time I lose here?
counter += 1
speed_new_daemon = time.time() - speed_new_daemon
speed_parser = time.time()
result = out_queue.get()
my_parser(result)
speed_parser = time.time() - speed_parser
# speed_parser only 80%, when speed_new_daemon takes 20%...
in_queue.join()