Как ускорить выполнение запросов в Python? - PullRequest
0 голосов
/ 03 августа 2020

Я написал сценарий для проверки всех возможных изображений, которые могут быть у меня на веб-сайте, и загрузки, если они существуют. Скрипт работает, но требует approximately 29 days до sh поиска по всем возможным URL-адресам. Есть 36^5 (60,466,176) URL-адресов для скрипта для поиска, поэтому я могу понять, почему это занимает так много времени, но 29 дней? Я действительно не хочу запускать сценарий в течение 30 дней ...

Итак, мой вопрос таков: есть ли способ ускорить этот сценарий, чтобы не ждать 30 дней? Я бы предпочел пару часов, но на самом деле все может помочь.

Математика:

It scans 6 URLs every 250ms (quarter of a second)
6~ : 250 milliseconds (*4) = 24~ : 1 second

That's approximate 24 URLs sent in 1 second

60,466,176 / 24 URLs sent = 2519424~ secs
2519424~ / 60 = 41990.4 minutes
41990.4 minutes / 60 = 699.84 hours
699.84 hours / 24 = 29.16 days

Код:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from threading import Thread
from Queue import Queue
from string import digits, uppercase
from itertools import product
import sched
import time
import requests
from os import path
from progress.bar import IncrementalBar

# Change USER to your user ID and execute

URL = 'http://cstrips.bitstrips.com/%s_USER.png'
WAITTIME = 0.05
CONCURRENCY = 20

bar = IncrementalBar('Processing', max=60466176)

""" download images """


def dwIMG(p_sID):
    sURL = URL % p_sID
    idPath = p_sID + '.png'
    if path.exists(idPath):
        print(idPath, "already exists, skipping")
        return

    # print sURL,
    r = requests.get(sURL)

    if r.status_code == 200:
        f = open(idPath, 'wb')
        f.write(r.content)
        f.close()


def genIDS():
    q = Queue(CONCURRENCY * 2)

    def doWork():
        while True:
            id = q.get()
            try:
                dwIMG(id)
            except:
                print("error", id)
            q.task_done()

    for i in range(CONCURRENCY):
        t = Thread(target=doWork)
        t.daemon = True
        t.start()

    print("computing ids")
    chars = digits + uppercase
    for sID in product(chars, repeat=5):
        q.put(''.join(sID))
        bar.next()

    print("done computing")

    q.join()


if __name__ == '__main__':
    genIDS()
...