Многопоточность запросов без списка URL - PullRequest
0 голосов
/ 08 апреля 2019

В настоящее время я пытаюсь сделать свои запросы быстрее, используя многопоточность, но я не уверен, как сделать это так, как я хочу. Я знаю о грекестах, но они, кажется, требуют список URL. У меня есть код с начальным номером, содержащимся в URL, и я хочу, чтобы все потоки были остановлены после получения status_code 200

Я пытался выполнить это с помощью греквестов, но не смог заставить его работать. Также пробовал потоки, но не знаю, как остановить все темы после того, как рабочий URL был найден

import requests
import webbrowser

def url_request(number):
    url = "http://website.com/download/" + str(number) + ".zip"
    r = requests.head(url)
    if r.status_code == 404:
        print(url + " - 404 Not Found!")
        number += 1
        url_request(number)
    elif r.status_code == 200:
        webbrowser.open(url)
        print(url + " - 200 Found!")

if __name__ == "__main__":
    url_request(int(input("Starting number: ")))

Я хочу, чтобы код выполнял сразу несколько request.head с номером после «Стартового номера» и остановится после того, как один из потоков найдет URL с кодом состояния 200.

1 Ответ

0 голосов
/ 08 апреля 2019

Хорошо, разобрался. Спасибо за ваш совет.

Вот код:

from gevent import monkey
monkey.patch_all()
import grequests
import webbrowser


def url_request_threaded(startnumber, stopnumber):
    urls = []
    for i in range(startnumber, stopnumber):
        urls.append("http://website.com/download/" + str(i) + ".zip")
    gr = (grequests.head(url, stream=False) for url in urls)
    gresponses = grequests.imap(gr, size=10)
    try:
        for response in gresponses:
            if response.status_code == 404:
                print(response.url + " - 404 Not Found!")
            elif response.status_code == 200:
                webbrowser.open(response.url)
                print(response.url + " - 200 Found!")
                raise SystemExit
    except SystemExit:
        pass


if __name__ == "__main__":
    while True:
        try:
            startn = input("Starting number: ")
            startn = int(startn)
            stopn = input("End number: ")
            stopn = int(stopn)
            url_request_threaded(b, v, startn, stopn)
        except ValueError:
            print("Must be a number!")
            continue
        break

...