threading的多线程并发
对比多进程并发:
* 消耗资源较少
* 线程应该更注意共享资源的操作
* 在python中应该注意GIL问题,网络延迟较高,线程并发也是一种可行的方法
实现步骤:
1. 创建套接字,绑定监听
2. 接收客户端请求,创建新的线程
3. 主线程继续接收其他客户端连接
4. 分支线程启动对应的函数处理客户端请求
5. 当客户端断开,则分支线程结束
Cookie:
import traceback
traceback.print_exc()
功能:更详细的打印异常信息
#多线程构建服务器
from socket import *
import os,sys
from threading import *
import traceback
Host = '0.0.0.0'
Port = 8888
Addr = (Host,Port)
#客户端处理函数
def handler(connfd):
print('connect from:{}'.format(connfd.getpeername))
while True:
data = connfd.recv(1024)
if not data:
break
print(data.decode())
connfd.send(b'Receive request')
connfd.close()
#创建套接字
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(Addr)
s.listen(5)
#等待客户端请求
while True:
try:
connfd,addr = s.accept()
except KeyboardInterrupt:
s.close()
sys.exit('服务端退出')
except Exception as e:
traceback.print_exc()
continue
#若不传递connfd将导致多线程共同使用全局变量connfd
t = Thread(target = handler,args = (connfd,))
t.setDaemon(True)
t.start()
# join函数是阻塞函数不能写在这里
# t.join()
# 若在最后循环退出,则很久之内都不会执行故使用setDaemon给系统处理退出的线程