python服务器程序cpu使用率高

标签 python multithreading tcp

我正在试验 python tcp 服务器(我最近才发现 python 的强大之处)。无论如何,服务器运行得很好并按我预期的方式打印数据,但是当我在 Windows 任务管理器中查看 CPU 使用率时,它显示 python.exe 占用了 97%-99% 的 CPU。

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

这是我想知道的:

  1. 为什么cpu占用这么高?

  2. 为什么我会在两台不同的机器上看到不同的运行情况(一台是 Windows 7,另一台是 Server 2008,这有关系吗)?

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

在此先感谢您的帮助!

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()

最佳答案

您正在使用 setblocking(0),这意味着您的套接字没有阻塞。您正在做的事情称为 轮询 并将尽可能多地使用 CPU。

当您使用线程时,您不需要轮询。只需删除 setblocking(0) 行,它就会正常工作。

关于python服务器程序cpu使用率高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23837827/

相关文章:

python - utf-16-le BOM csv 文件

java - Rest Web 服务接口(interface) - 多线程

javascript - 是否可以使用 JavaScript 连接到 SSH?

c - TCP 客户端-服务器 "bad address"错误(在 C 中)

java - 服务器未从 java tcp/ip 客户端接收数据

python - 当只有一个函数需要时,嵌套函数是一种好方法吗?

python - Django View 未保存到模型

python - 如何从 selenium webdriver 元素中提取链接?

java - 等待 SwingWorker 完成

java - Java线程-保持函数与线程的多个返回值同步