一、并发编程&网络编程
网络编程:基于网络基础知识、socket模块实现网络的数据传输;
并发编程:基于多进程、多线程等来提升程序的执行效率。
但在很多框架的内部其实会让两者结合,使用多进程和多线程来提高网络编程的处理效率。
(一)多线程socket服务端
服务端:
# 收发数据
def task(conn):
while True:
client_data = conn.recv(1024)
data = client_data.decode('utf-8')
print("收到客户端发来的信息", data)
if data.upper() == 'Q':
break
conn.sendall("收到收到".encode('utf-8'))
conn.close()
# 连接服务器
def run():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001))
sock.listen(5)
while True:
# 等待客户端连接(主线程)
conn, addr = sock.accept()
# 创建子线程
t = threading.Thread(target=task, args=(conn,))
t.start()
socket.close()
if __name__ == '__main__':
run()
客户端
import socket
#向指定ip发送连接请求
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8001))
while True:
txt = input(">>>")
client.sendall(txt.encode('utf-8'))
if txt.upper() == "Q":
break
reply = client.recv(1024)
print(reply.decode('utf-8'))
#关闭连接,关闭连接时会向服务端发出空数据
client.close()
(二)多进程&socket服务端
服务端:
import socket
import multiprocessing
def task(conn):
while True:
client_data = conn.recv(1024)
data = client_data.decode('utf-8')
print("收到客户端发来的消息:", data)
if data.upper == 'Q':
break
conn.sendall("收到收到".encode('utf-8'))
def run():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8001))
sock.listen(5)
while True:
#等待客户端来连接
conn, addr = sock.accept()
#创建子进程
t = multiprocessing.Process(target=task, args=(conn, ))
t.start()
sock.close()
if __name__ == '__main__':
run()
客户端
import socket
#向指定ip发送连接请求
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8001))
while True:
txt = input(">>>")
client.sendall(txt.encode('utf-8'))
if txt.upper() == "Q":
break
reply = client.recv(1024)
print(reply.decode('utf-8'))
#关闭连接,关闭连接时会向服务端发出空数据
client.close()
二、并发和并行
串型:多个任务排队按照先后顺序逐一执行;
并发:假设有多个任务,只有一个CPU,同一时刻只能处理一个任务,为了避免串行,让CPU每个任务都执行一点,然后再切换,达到并发效果(看似都在同时进行)。
python代码有:协程、多线程。
并行:假设有多个任务,有多个CPU,那么同一时刻每个CPU都执行一个任务,任务可以真正的同时运行。并行在python代码中体现为:多进程。
三、单例模式
本文含有隐藏内容,请 开通VIP 后查看