2011-03-20 7 views

답변

0

클라이언트를 "제공"하는 스레드에서 클라이언트가 연결될 때 증가하는 전역 카운트를 사용하고 연결이 끊어 질 때 감소합니다.

그렇게 수를 알고있는 각 클라이언트 연결에 대한 새 스레드를 교환 SocketServer.ThreadingTCPServer

5

(Windows가 grepwc의 포트를 사용에서) 다음 적절한 grep 필터와 wc -lnestat -an를 사용하여 OS 수준에서 계산하려면

num_client = threading.activeCount() - 1 # Don't count the main thread. 

,691 : 특정 순간에 연결된 클라이언트의 그래서 그냥 threading.activeCount를 사용하고 클라이언트의 수는있을 것입니다, 그 순간에 살아 얼마나 많은 스레드 아는 것과 동일

물론 스레드의 스왑 부분에 코드의 다른 부분이 있으면 정확한 결과를 얻지 못하기 때문에 클라이언트 용 카운터를 추가하여 process_request() 및 process_request_thread() 메소드를 덮어 쓸 수 있다고 수정해야합니다. 예 here에서

나는 두 가지 방법

을 테스트하기 위해이 코드 조각을 썼다
import time 
import socket 
import threading 
from SocketServer import ThreadingTCPServer, BaseRequestHandler 


def client(ip, port, message): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect((ip, port)) 
    sock.send(message) 
    response = sock.recv(1024) 
    sock.close() 


class ThreadedTCPRequestHandler(BaseRequestHandler): 

    def handle(self): 
     data = self.request.recv(1024) 
     cur_thread = threading.currentThread() 
     response = "%s: %s" % (cur_thread.getName(), data) 
     self.request.send(response) 
     time.sleep(1) 


class MyServer(ThreadingTCPServer): 

    def __init__(self, *args, **kws): 
     self._num_client = 0 
     ThreadingTCPServer.__init__(self, *args, **kws) 

    def process_request(self, *args, **kws): 
     print "swap thread" 
     self._num_client += 1 
     ThreadingTCPServer.process_request(self, *args, **kws) 

    def process_request_thread(self, *args, **kws): 
     ThreadingTCPServer.process_request_thread(self, *args, **kws) 
     print "kill thread" 
     self._num_client -= 1 

    def get_client_number(self): 
     return self._num_client 


def my_client_count(ignore=1): 
    return threading.activeCount() - ignore 


if __name__ == '__main__': 
    server = MyServer(("localhost", 0), ThreadedTCPRequestHandler) 

    server_thread = threading.Thread(target=server.serve_forever) 
    ip, port = server.server_address 

    server_thread.setDaemon(True) 
    server_thread.start() 

    print "client 1 connected" 
    client(ip, port, "Hello World 1") 
    print "number of client get_client_number : %s, enumerate : %s" \ 
     % (server.get_client_number(), my_client_count()) 
    print "client 2 connected" 
    client(ip, port, "Hello World 2") 
    print "number of client get_client_number : %s, enumerate : %s" \ 
     % (server.get_client_number(), my_client_count()) 

    time.sleep(3) 
    print "client 3 connected" 
    client(ip, port, "Hello World 3") 
    print "number of client get_client_number : %s, enumerate : %s" \ 
     % (server.get_client_number(), my_client_count()) 

출력 :

client 1 connected 
swap client thread 
number of client get_client_number : 1, enumerate : 2 
client 2 connected 
swap client thread 
number of client get_client_number : 2, enumerate : 3 
kill client thread 
kill client thread 
client 3 connected 
swap client thread 
number of client get_client_number : 1, enumerate : 2 
두 번째 방법은보다 정확한 값을 제공 볼 수 음

하고, 두 가지 방법의 차이는 내 서버가 스레드를 사용하여 실행 중이므로 항상 1의 차이를 설명하는 +1 스레드입니다.

W 이것이 도움이 되길 바랍니다.

관련 문제