多线程搜寻器在运行一段时间后变得越来越慢

时间:2018-12-27 14:25:38

标签: python-3.x tcp python-requests windows-10 python-multithreading

我在Windows下编写了一个多线程Web搜寻器。我使用的库是requeststhreading。我发现程序运行一段时间(约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()

我搜索了问题。回答说这是Linux下TCP的重用和回收问题。我不太清楚这个答案。答案如下。我翻译了中文的答案。

  1. 在Linux shell中键入命令:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  2. 发现TIME_WAIT接近2W。因此,必须有许多TCP连接。
  3. 使用以下代码分别设置TCP的重用时间和回收时间: echo "1" > /proc/sys/net/ipv4/tcp_tw_reuseecho "1" > /proc/sys/net/ipv4/tcp_tw_recycle

该答案似乎正确。这应该是网络问题。我应该如何在Windows下解决这个问题。

1 个答案:

答案 0 :(得分:2)

多线程搜寻器将耗尽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秒。默认值也为 多线程爬虫很久。)

感谢大家对问题的贡献。这对很多人都有帮助。

Reference site