Python服务器程序具有较高的CPU使用率

时间:2014-05-23 20:24:27

标签: python multithreading tcp

我正在尝试使用python tcp服务器(我刚刚发现了python的真棒)。无论如何,服务器运行得很好并按照我期望的方式打印数据,但是当我查看Windows任务管理器中的CPU使用情况时,它显示python.exe消耗了97%-99%的CPU。

为了看看会发生什么,我在另一台计算机上再次运行它,它只使用了大约50%的cpu。

这是我想知道的:

  1. 为什么cpu的使用率如此之高?

  2. 为什么我会在两台不同的机器上看到差异(一台是Windows 7,另一台是服务器2008,可能重要)?

  3. 我正在为每个连接创建一个新线程,并运行一个始终为true的while循环,但我有一个" break"当不再有连接时。这个线程是否被正确销毁?

  4. 提前感谢您的帮助!

    import socket
    import threading
    import logging
    import time
    
    TCP_IP = "127.0.0.1"
    TCP_PORT = 10000
    BUFFER_SIZE = 1024
    SOCKET_TIMEOUT = 2
    
    
    def handler(conn):
        while 1:
            try:
                data = conn.recv(BUFFER_SIZE)
                if data:
                    dataS = data.decode(encoding = 'UTF-8')
                    print ("received data: ")
                    print (dataS)
                    logging.getLogger("TestLogger").critical(dataS)
    
            except socket.error as e:
                print("connection closed")
                conn.close()
                break
    
    try:    
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind((TCP_IP, TCP_PORT))
        s.setblocking(0)
        s.listen(5)
    
    except Exception as e:
        print(e)
    
    
    while 1:
        try:
            conn, addr = s.accept()
        except Exception as e:
            continue
        print ('Connection address:')
        print (addr)
        conn.settimeout(SOCKET_TIMEOUT)
        connThread = threading.Thread(target = handler, args = (conn,))
        connThread.start()
    

3 个答案:

答案 0 :(得分:5)

您正在使用setblocking(0),这意味着您的套接字没有阻止。你正在做的是polling,它会尽可能多地使用CPU。

使用线程时,您不需要轮询。只需删除setblocking(0)行即可正常使用。

答案 1 :(得分:3)

问题是无限循环(1)。请包含几微秒的延迟(time.sleep(0.001)),这会大大降低CPU使用率。

答案 2 :(得分:1)

由于声誉低下,只能评论rsy的答案。 在您的特定情况下,当您使用“ conn.recv”接收数据时,只需设置setblocking(1)就可以解决问题,因为pmoleri已经回答了。

但是,如果使用“ select”语句在循环中进行轮询,则setblocking(1)无效,并且rsy的解决方案的延迟很短(time.delay(0.01))是解决方法。