2014-05-23 9 views
5

Eksperymentuję z serwerem python tcp (niedawno odkryłem niesamowitą atrakcję, która jest pytonem). W każdym razie, serwer działa dobrze i drukuje dane tak jak się spodziewałem, ale kiedy patrzę na użycie procesora w menedżerze zadań Windows pokazuje, że python.exe zużywa 97% -99% procesora.Program serwera w języku Python ma wysokie użycie procesora.

Aby sprawdzić, co się stanie, uruchomiłem go ponownie na innym komputerze i korzystałem tylko z około 50% procesora.

Oto co zastanawiam się:

  1. Dlaczego użycie procesora jest tak wysoki?

  2. Dlaczego widziałbym różnicę działającą na dwóch różnych komputerach (jedna to Windows 7, druga to serwer 2008, czy to ma znaczenie)?

  3. Tworzę nowy wątek dla każdego połączenia i uruchamiam pętlę while, która jest zawsze prawdziwa, ale mam "przerwę", gdy nie ma już połączenia. Czy ten wątek zostanie zniszczony poprawnie?

Z góry dziękuję za pomoc!

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

Powinieneś opublikować to na recenzji kodu, ponieważ wydaje się, że jest to kod funkcjonalny. –

+0

Nie byłem świadomy przeglądu kodu. Czy powinienem zatem usunąć ten post? – jteezy14

+0

Nie jestem w 100% pewny, mogę chcieć zapytać o metatag –

Odpowiedz

5

Używasz setblocking(0), co oznacza, że ​​twoje gniazdo nie blokuje się. To, co robisz, nazywa się polling i używa tyle CPU, ile może.

Podczas korzystania z wątków nie trzeba sondować. Po prostu usuń linię setblocking(0), która powinna działać poprawnie.

+0

Masz rację. Dziękuję bardzo! Wykorzystanie procesora jest teraz znikome. – jteezy14

1

Problem to nieskończona pętla while (while 1). Proszę podać kilka mikrosekund opóźnienia (time.sleep (0.001)), to spowoduje drastyczne zużycie procesora.

Powiązane problemy