我正在尝试使用python tcp服务器(我刚刚发现了python的真棒)。无论如何,服务器运行得很好并按照我期望的方式打印数据,但是当我查看Windows任务管理器中的CPU使用情况时,它显示python.exe消耗了97%-99%的CPU。
为了看看会发生什么,我在另一台计算机上再次运行它,它只使用了大约50%的cpu。
这是我想知道的:
为什么cpu的使用率如此之高?
为什么我会在两台不同的机器上看到差异(一台是Windows 7,另一台是服务器2008,可能重要)?
我正在为每个连接创建一个新线程,并运行一个始终为true的while循环,但我有一个" break"当不再有连接时。这个线程是否被正确销毁?
提前感谢您的帮助!
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()
答案 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))是解决方法。