在Python中阅读和处理100,000个URL的最快方法

时间:2016-06-15 02:40:28

标签: python multithreading http concurrency multiprocessing

我有一个包含100,000个网址的文件,我需要请求处理。与请求相比,处理花费了不可忽略的时间,因此简单地使用多线程似乎只能让我部分加速。根据我的阅读,我认为使用multiprocessing模块或类似的模块可以提供更大幅度的加速,因为我可以使用多个核心。我猜我想要使用一些多个进程,每个进程都有多个线程,但我不知道该怎么做。

这是我当前的代码,使用线程(基于What is the fastest way to send 100,000 HTTP requests in 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 个答案:

答案 0 :(得分:0)

如果文件不大于可用内存,请使用mmap(https://docs.python.org/3/library/mmap.html)而不是使用“open”方法打开它。它将提供与使用内存而不是文件相同的速度。

with open("test.txt") as f:
    mmap_file = mmap.mmap(f.fileno(), 0)
    # code that does what you need
    mmap_file.close()