python 多进程 多线程网络并发模型通信

#基于fork的多进程网络并发模型

实现步骤

  1. 创建监听套接字
  2. 等待接收客户端请求
  3. 客户端连接创建新的进程处理客户端请求
  4. 原进程继续等待其他客户端连接
  5. 如果客户端退出,则销毁对应的进程

服务端代码呈现

"""
fork_server.py   基于fork的多进程服务
重点代码
"""
from socket import *
import os
import signal

# 全局变量
HOST = '0.0.0.0'
PORT = 8888
ADDR = (HOST,PORT)

# 处理客户端请求
def handle(c):
    while True:
        data = c.recv(1024)
        if not data:
            break
        print(data.decode())
        c.send(b'OK')
    c.close()

# 创建tcp套接字
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(ADDR)
s.listen(3)

# 处理僵尸进程产生
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
print("Listen the port 8888...")
while True:
    # 循环接受客户端链接
    try:
        c,addr = s.accept()
        print("Connect from",addr)
    except KeyboardInterrupt:
        s.close()
        os._exit(0)
    except Exception as e:
        print(e)
        continue

    # 客户端链接处理
    pid = os.fork()
    if pid == 0:
        # 处理请求
        s.close()
        handle(c) # 处理具体请求
        os._exit(0)  # 处理完请求子进程结束
    else:
        c.close() # 父进程循环回去继续等待其他客户端

客户端代码呈现
‘’’
客户端
‘’’

from socket import  *
socket=socket()
server_addr=('0.0.0.0',13736)
socket.connect(server_addr)
while True:
      data = input("Msg>>")
      socket.send(data.encode())
      if not data:
          break
      data=socket.recv(1024)
      print('server:',data.decode())#d打印字符串
socket.close()

基于threading的多线程网络并发

实现步骤

  1. 创建监听套接字
  2. 循环接收客户端连接请求
  3. 当有新的客户端连接创建线程处理客户端请求
  4. 主线程继续等待其他客户端连接
  5. 当客户端退出,则对应分支线程退出

‘’’

多线程并发 重点代码

'''
from  socket import *
import  sys
from threading import  Thread
HOST = '0.0.0.0'
PORT = 13736
ADDR= (HOST,PORT)
def handle(c):
    while True:
        data = c.recv(1024)
        if not data:
            break
        print(data.decode())
        c.send(b'ok')
    c.close()
#创建套接子
s=socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(ADDR)
s.listen(3)
print("Listen the port 8888...")
#循环接受客户端链接请求
while True:
    try:
        c,addr = s.accept()
        print("Connect from",addr)
    except KeyboardInterrupt:
        sys.exit('服务器退出')
    except Exception as e:
        print(e)
        continue
    #创建线程处理
    t=Thread(target=handle,args=(c,))
    t.setDaemon(True) #主线程退出 其他线程也退出
    t.start() #  线程资源小于进程 不用回收 join
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值