単一プロセス+マルチスレッド+同期pythonサーバdemo


import socket, threading, queue, time

#   
class Work(threading.Thread):
    def __init__(self, pendding_queue=queue.Queue()):
        self.pendding_queue = pendding_queue
        super().__init__()
        self.start()

    def run(self):
        while True:
            try:
                callable, args =self.pendding_queue.get()
            except Exception as e:
                # print('[E]: ' + str(e))
                time.sleep(1)
                continue
            callable(*args)
            print('threads: ' + str(threading.active_count()) + '  pendding_num: ' + str(self.pendding_queue.qsize()))

#    
class ThreadPool():
    def __init__(self, count=10):
        self.count = count
        self.pendding_queue = queue.Queue() # (func, args)
        self.thread_ids = []
        self.create_thread(self.count)

    def add_request(self, target, args):
        self.pendding_queue.put((target, args))

    def create_thread(self, num):
        for i in range(num):
            t = Work(self.pendding_queue)
            self.thread_ids.append(t.ident)

#     
def handle(conn, addr):
    # print(str(threading.get_ident()) + ' handle connection from addr' + str(addr))
    data = conn.recv(2048)
    # print('recv data:' + str(data, 'utf-8'))
    res = b'back: ' + data
    # time.sleep(1)
    conn.send(res)
    # print('send back data:' + str(res, 'utf-8'))
    conn.close()
    # print('close connection:' + str(conn))

#      
def run_server(addr_info):
    sock = socket.socket()
    sock.bind(addr_info)
    sock.listen(5)
    threadpool = ThreadPool(10)
    print('start sever at:' + str(addr_info))
    while True:
        conn, addr = sock.accept()
        threadpool.add_request(handle, (conn, addr))

        # threading.Thread(target=handle, args=(conn, addr)).start()
        # print('current active thread count:' + str(threading.active_count()))


if __name__ == '__main__':
    addr_info = ('localhost', 1111)
    run_server(addr_info)