Многопоточный сканер становится все медленнее и медленнее после запуска в течение некоторого времени - PullRequest
0 голосов
/ 27 декабря 2018

Я написал многопоточный веб-сканер под Windows.Библиотеки, которые я использовал, были requests и threading.Я обнаружил, что программа стала работать медленнее и медленнее после некоторого времени работы (около 500 страниц).Когда я останавливаю программу и снова запускаю, программа снова ускоряется.Кажется, что есть много ожидающих соединений, что вызывает замедление.Как мне решить проблему?

Мой код:

import requests, threading,queue
req = requests.Session()

urlQueue = queue.Queue()
pageList = []
urlList = [url1,url2,....url500]
[urlQueue.put(i) for i in urlList]

def parse(urlQueue):

    try:
       url = urlQueue.get_nowait()
    except:
       break
    try:
       page = req.get(url)
       pageList.append(page)
    except:
       continue

if __name__ == '__main__':

    threadNum = 4
    threadList = []
    for i in threadNum:
        t = threading.Thread(target=(parse),args=(urlQueue,))
        threadList.append(t)
    for thread in threadList:
        thread.start()
    for thread in threadList:
        thread.join()

Я искал проблему.Ответ сказал, что это проблема повторного использования и переработки TCP под Linux.Я не очень хорошо понимаю этот ответ.Ответ ниже.Я перевел ответ с китайского.

  1. Введите команду в оболочке Linux: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  2. Найдено TIME_WAIT почти 2 Вт.Таким образом, должно быть много TCP-соединений.
  3. Используйте следующий код для установки времени повторного использования и перезапуска соответственно TCP: echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse, echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle

Этот ответкажется правильным.Это должна быть проблема с сетью.Как мне решить эту проблему под Windows.

1 Ответ

0 голосов
/ 28 декабря 2018

Многопоточный сканер исчерпает TCP-соединения.Нам нужно установить TcpTimedWaitDelay для быстрого повторного использования и перезапуска TCP-соединений.Мы можем решить эту проблему, вручную изменив regedit или введя код.

Как это сделать в Windows с кодом: (Вам нужно запустить код как администратор, или иначе,возникнет ошибка. )

import win32api,win32con

key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, r'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters', 0, win32con.KEY_SET_VALUE)

win32api.RegSetValueEx(key, 'TcpTimedWaitDelay', 0, win32con.REG_SZ, '30')

win32api.RegCloseKey(key)

Как это сделать в Windows вручную:

  1. Открыть RUN и ввести regedit
  2. Найти: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
  3. Нажмите Edit - New - Expandable String Value
  4. Создать TcpTimedWaitDelay (если эта запись уже существует, вы ненеобходимо создать)
  5. Измените значение на 30. (Значение TCP варьируется от 30 до 300 секунд, а значение по умолчанию составляет 120 секунд. Значение по умолчанию слишком длинное для многопоточного сканера.)

Спасибо за вклад всех ваших ребят в вопросы.Это помогает многим людям.

Справочный сайт

...