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)
单进程+多线程+同步 python 服务器 demo
最新推荐文章于 2025-04-11 12:05:25 发布