8.14 day32 TCP服务端并发 GIL解释器锁 python多线程是否有用 死锁与递归锁 信号量event事件线程q

TCP服务端支持并发

解决方式:开多线程

服务端

基础版

import socket
"""
服务端
1.要有固定的IP和PORT
2.24小时不间断提供服务
3.能够支持并发
""" server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5) def talk(conn):
while True:
try:
data = conn.recv(1024)
if len(data) == 0:break
print(data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError as e:
print(e)
break
conn.close() while True:
conn, addr = server.accept() # 监听 等待客户端的连接 阻塞态
print(addr)

进阶版:支持并发

import socket
from threading import Thread # ①多导入了这个 """
服务端
1.要有固定的IP和PORT
2.24小时不间断提供服务
3.能够支持并发
""" server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5) def talk(conn):
while True:
try:
data = conn.recv(1024)
if len(data) == 0:break
print(data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError as e:
print(e)
break
conn.close() while True:
conn, addr = server.accept() # 监听 等待客户端的连接 阻塞态
print(addr)
t = Thread(target=talk,args=(conn,)) # ②加了这个
t.start() # ③加了这个

客户端

import socket
# 客户端都是一样的
client = socket.socket()
client.connect(('127.0.0.1',8080)) while True:
client.send(b'hello')
data = client.recv(1024)
print(data.decode('utf-8'))

GIL全局解释器锁


ps:python解释器有很多种  最常见的就是CPython解释器,GIL也是在CPython中的。

GIL本质也是一把互斥锁:(是加在解释器上的

GIL的存在是因为CPython解释器的内存管理不是线程安全的

GIL工作原理:将并发变成串行牺牲效率保证数据的安全 ,用来阻止同一个进程下的多个线程的同时执行

上一篇:【BestCoder】【Round#41】


下一篇:暑期训练狂刷系列——Hdu 3506 Largest Rectangle in a Histogram (单调栈)