Самый быстрый способ чтения и обработки 100 000 URL-адресов в Python

У меня есть файл с 100 000 URL, которые мне нужно запросить, а затем обработать. Обработка занимает ничтожно малое количество времени по сравнению с запросом, поэтому простое использование многопоточности дает мне лишь частичное ускорение. Из того, что я прочитал, я думаю, используя multiprocessing Модуль, или что-то подобное, предложил бы более существенное ускорение, потому что я мог бы использовать несколько ядер. Я предполагаю, что хочу использовать несколько процессов, каждый с несколькими потоками, но я не уверен, как это сделать.

Вот мой текущий код, использующий многопоточность (основанный на том, что является самым быстрым способом отправки 100 000 HTTP-запросов в Python?):

from threading import Thread
from Queue import Queue
import requests
from bs4 import BeautifulSoup
import sys

concurrent = 100

def worker():
    while True:
        url = q.get()
        html = get_html(url)
        process_html(html)
        q.task_done()

def get_html(url):
    try:
        html = requests.get(url, timeout=5, headers={'Connection':'close'}).text
        return html
    except:
        print "error", url
        return None

def process_html(html):
    if html == None:
        return
    soup = BeautifulSoup(html)
    text = soup.get_text()
    # do some more processing
    # write the text to a file

q = Queue(concurrent * 2)
for i in range(concurrent):
    t = Thread(target=worker)
    t.daemon = True
    t.start()
try:
    for url in open('text.txt'):
        q.put(url.strip())
    q.join()
except KeyboardInterrupt:
    sys.exit(1)

1 ответ

Если файл не превышает вашу доступную память, вместо открытия его методом "open" используйте mmap ( https://docs.python.org/3/library/mmap.html). Это даст такую ​​же скорость, как если бы вы работали с памятью, а не с файлом.

with open("test.txt") as f:
    mmap_file = mmap.mmap(f.fileno(), 0)
    # code that does what you need
    mmap_file.close()
Другие вопросы по тегам