知识补充
- 一、并发编程&网络编程
- (一)多线程socket服务端
- (二)多进程&socket服务端
- 二、并发和并行
- 三、单例模式
一、并发编程&网络编程
网络编程:基于网络基础知识、socket模块实现网络的数据传输;
并发编程:基于多进程、多线程等来提升程序的执行效率。
但在很多框架的内部其实会让两者结合,使用多进程和多线程来提高网络编程的处理效率。
(一)多线程socket服务端
服务端:
# 收发数据
def task(conn):while True:client_data = conn.recv(1024)data = client_data.decode('utf-8')print("收到客户端发来的信息", data)if data.upper() == 'Q':breakconn.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":breakreply = client.recv(1024)print(reply.decode('utf-8'))#关闭连接,关闭连接时会向服务端发出空数据
client.close()
(二)多进程&socket服务端
服务端:
import socket
import multiprocessingdef task(conn):while True:client_data = conn.recv(1024)data = client_data.decode('utf-8')print("收到客户端发来的消息:", data)if data.upper == 'Q':breakconn.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":breakreply = client.recv(1024)print(reply.decode('utf-8'))#关闭连接,关闭连接时会向服务端发出空数据
client.close()
二、并发和并行
串型:多个任务排队按照先后顺序逐一执行;
并发:假设有多个任务,只有一个CPU,同一时刻只能处理一个任务,为了避免串行,让CPU每个任务都执行一点,然后再切换,达到并发效果(看似都在同时进行)。
python代码有:协程、多线程。
并行:假设有多个任务,有多个CPU,那么同一时刻每个CPU都执行一个任务,任务可以真正的同时运行。并行在python代码中体现为:多进程。