2014-05-23 17 views
5

Sto sperimentando con un server tcp python (ho appena scoperto la suggestione che è python). Ad ogni modo, il server funziona perfettamente e stampa i dati come mi aspetterei, ma quando guardo l'utilizzo della CPU nel task manager di Windows mostra che python.exe sta consumando il 97% -99% della CPU.Il programma server Python ha un elevato utilizzo della CPU

Solo per vedere cosa sarebbe successo, l'ho eseguito di nuovo su un altro computer e utilizzato solo il 50% circa della CPU.

Ecco quello che mi chiedo:

  1. Perché l'utilizzo della CPU così in alto?

  2. Perché dovrei vedere una differenza in esecuzione su due macchine diverse (una è Windows 7 l'altra è server 2008, potrebbe essere così)?

  3. Sto creando un nuovo thread per ogni connessione e l'esecuzione di un ciclo while è sempre true, ma ho una "interruzione" quando non c'è più una connessione. Questo thread viene distrutto correttamente?

Grazie in anticipo per qualsiasi aiuto!

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

Si dovrebbe postare questo sulla revisione del codice, in quanto sembra essere il codice funzionale. –

+0

Non ero a conoscenza della revisione del codice. Dovrei rimuovere questo post, allora? – jteezy14

+0

Non sono sicuro al 100%, potrei voler chiedere alla meta chat –

risposta

5

Si utilizza setblocking(0), che significa che il socket non sta bloccando. Quello che stai facendo si chiama polling e userà tutta la CPU che può.

Quando si utilizza il threading non è necessario eseguire il polling. Basta rimuovere la riga setblocking(0) e dovrebbe funzionare correttamente.

+0

Hai ragione. Grazie mille! L'utilizzo della CPU è ora trascurabile. – jteezy14

1

Il problema è il ciclo while infinito (mentre 1). Si prega di includere un ritardo di pochi microsecondi (time.sleep (0.001)), questo riduce drasticamente l'utilizzo della CPU.