2

Я написал сценарий, который извлекает URL-адреса из файла и одновременно отправляет HTTP-запросы ко всем URL-адресам. Теперь я хочу ограничить количество HTTP-запросов в секунду и пропускную способность для каждого интерфейса (eth0, eth1 и т. Д.) В сеансе. Есть ли способ достичь этого на Python?Ограничение количества HTTP-запросов в секунду на Python

ответ

0

Вы можете использовать объект семафор, который является частью стандартной Lib Python: python doc

Или, если вы хотите работать с потоками напрямую, вы можете использовать ожидание ([время]).

В комплекте с Python нет библиотеки, которая может работать на Ethernet или другом сетевом интерфейсе. Самое низкое, на которое вы можете пойти, - это сокет.

Основываясь на вашем ответе, вот мое предложение. Обратите внимание на active_count. Используйте это только для проверки того, что ваш скрипт запускает только два потока. В этом случае им будет три, потому что номер один - это ваш скрипт, тогда у вас есть два запроса URL.

import time 
import requests 
import threading 

# Limit the number of threads. 
pool = threading.BoundedSemaphore(2) 

def worker(u): 
    # Request passed URL. 
    r = requests.get(u) 
    print r.status_code 
    # Release lock for other threads. 
    pool.release() 
    # Show the number of active threads. 
    print threading.active_count() 

def req(): 
    # Get URLs from a text file, remove white space. 
    urls = [url.strip() for url in open('urllist.txt')] 
    for u in urls: 
     # Thread pool. 
     # Blocks other threads (more than the set limit). 
     pool.acquire(blocking=True) 
     # Create a new thread. 
     # Pass each URL (i.e. u parameter) to the worker function. 
     t = threading.Thread(target=worker, args=(u,)) 
     # Start the newly create thread. 
     t.start() 

req() 
+0

Как добавить его в свой скрипт? Я новичок в питоне. – Naveen

+0

Вам нужно будет опубликовать свой источник (часть потока), чтобы кто-то помог. Как говорит Питон: «Семафоры часто используются для защиты ресурсов с ограниченными возможностями». Начните со следующего и последующего расширения, чтобы он соответствовал вашему коду. Сначала установите предел = 5. Затем вам понадобится пул потоков -> pool = BoundedSemaphore (значение = limit). Затем заблокируйте поток пулом pool.acquire(), отправьте http-запрос (например, urllib2) и, наконец, разблокируйте поток пулом pool.release(). – Georgi

+0

импорта резьбонарезной импорта время импорта запросы четкости REQ(): URLs = [url.strip() для URL в открытом ('urllist.txt')] для и в диапазоне (LEN (URL)): г = requests.get (URL [U]) печати r.status_code, URL [U] нити = [] нити = threading.Thread (мишень = REQ) threads.start() – Naveen

0

Вы могли бы использовать понятие работник, как описано в документации: https://docs.python.org/3.4/library/queue.html

Добавить команду ожидания() внутри ваших работников, чтобы их ждать между запросами (в примере из документации: внутри "while true" после task_done).

Пример: 5 «Рабочий» -Треды с временем ожидания 1 с между запросами будут делать менее 5 выборок в секунду.

Смежные вопросы