前言
在此篇文章中,讲到了http服务器、进程线程,以及如何高效的利用多线程完成任务,实现资源的高效利用。
HTTP协议
success set_cookie服务器返回给客户的cookie ,存储在本地,标名一个用户 。
HTTP服务器
import socket
def server_client(new_socket):
#为这个客户端返回数据
#1.接受浏览器发过来的请求,http 请求,并且打印
result = new_socket.recv(1024)
print(result)
#2.返回 http 格式数据,给浏览器
#2.1 准备发送给浏览器数据 header
response = "HTTP/1.1 200 OK\r\n"
response +="\r\n" #这个是之间的空一行
#2.2 准备发送给浏览器数据 body
response += "<h1>hello world</h1>"
new_socket.send(response.encode("utf-8"))
#3.关闭套接字
new_socket.close()
def main():
#1.创建套接字
tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.绑定端口
tcp_server.bind(("",7890))
#3.设置为监听
tcp_server.listen(128)
while 1:
#4.等待客户端链接
new_socket,client_addr=tcp_server.accept()
#5.为这个客户端服务
server_client(new_socket) #这里直接写一个函数
tcp_server.close()
if __name__ == "__main__":
main()
多任务实现
import time
def sing():
for i in range(5):
print("正在唱歌")
time.sleep(1)
def dance():
for i in range(5):
print("正在跳舞")
time.sleep(1)
def main():
sing()
dance()
if __name__ == "__main__":
main()
多线程一起执行,当执行的时间足够短,就能构造出假的多线程:
- 并行:真的多任务
- 并发:假的多任务
多线程详细讲解
一个程序运行起来之后,一定有一个执行代码的东西,这个东西称之为线程。
主线程和子线程都可以单独的执行代码。
查看线程数量
enumerate枚举:
线程的运行是没有先后顺序的,线程在执行的时候会抢资源,这就是竞争资源问题,我们可以利用sleep()函数来进行线程的优先执行,如果创建threading时执行的函数,运行结束意味着子线程结束。当主线程死亡,意味着程序结束。因此 python程序中,主线程会等待着子线程结束之后, 主线程才会结束。
进程间通信
socket是进程间通信桥梁,queue队列先进先出。
下面写一个例子,实现一个进程写一个进程读取:
小结
对于进程和线程的高效利用,是每一个安全从业者所必不可少的技能,多线程、死锁、并发、进程池等问题也需要我们每个人都很清楚的掌握。