Я реализовал простую утилизацию веб-страниц с использованием торнадо, основная идея - вставить все URL-адреса в очередь q
и вызвать нескольких рабочих, проверить связь с URL-адресом и проверить его состояние (большинство URL-адресов не существует, т.е. получение тайм-аутов)
все ответы вставлены в другую очередь q2
, но это не имеет значения, поскольку обработка этой очереди происходит после того, как все рабочие сделали
Я также применил ту же методологию, используя потоки с тем же номером, что и concurrency
и реализация потоков намного быстрее, хотя шаги простаивают во время ожидания ответа от сети, в то время как торнадо IOLoop должен быть оптимальным для такого поведения
что мне не хватает?Thx в продвинутом
from tornado import httpclient, gen, ioloop, queues
concurrency = 100
@gen.coroutine
def get_response(url):
response = yield httpclient.AsyncHTTPClient().fetch(url, raise_error=False)
return response
@gen.coroutine
def main():
q = queues.Queue()
q2 = queues.Queue()
@gen.coroutine
def fetch_url():
url = yield q.get()
try:
response = yield get_response(url)
q2.put((url, response.code))
finally:
q.task_done()
@gen.coroutine
def worker():
while True:
yield fetch_url()
for url in urls:
q.put(url)
print("all tasks were sent...")
# Start workers, then wait for the work queue to be empty.
for _ in range(concurrency):
worker()
print("workers spwaned")
yield q.join()
print("done")
if __name__ == '__main__':
io_loop = ioloop.IOLoop.current()
io_loop.run_sync(main)
Поток ImpL прост (без мультиобработки) и использует следующий код
for i in range(concurrency):
t = threading.Thread(target=worker, args=())
t.setDaemon(True)
t.start()