python 简单搭建阻塞式单进程,多进程,多线程服务的实例


Posted in Python onNovember 01, 2017

我们可以通过这样子的方式去理解apache的工作原理

1 单进程TCP服务(堵塞式)

这是最原始的服务,也就是说只能处理个客户端的连接,等当前客户端关闭后,才能处理下个客户端,是属于阻塞式等待

from socket import *
serSocket = socket(AF_INET, SOCK_STREAM)
#重复使用绑定的信息
serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)

localAddr = ('', 7788)
serSocket.bind(localAddr)

serSocket.listen(5)

while True:
 print('-----?主进程,等待客户端连接??------')
 newSocket,destAddr = serSocket.accept()
 print('-----?.主进程,接下来负责数据处理[%s]-----'%str(destAddr))
 try:
  while True:
  recvData = newSocket.recv(1024)
  if len(recvData)>0:
   print('recv[%s]:%s'%(str(destAddr), recvData))
  else:
   print('[%s]客户端已经关闭?...'%str(destAddr))
  break
 finally:
  newSocket.close()

这种阻塞型自然不适合处理多客户端的请求,于是有了改版

2 多进程服务

采取多进程处理多客户端连接请求,对单进程进行了优化。

from socket import *
from multiprocessing import *
from time import sleep
# 处理客户端的请求并为其服务
def dealWithClient(newSocket,destAddr):
 while True:
  recvData = newSocket.recv(1024)
  if len(recvData)>0:
   print('recv[%s]:%s'%(str(destAddr), recvData))
  else:
   print('[%s]客户端已经关闭'%str(destAddr))
   break
 newSocket.close()
def main():
 serSocket = socket(AF_INET, SOCK_STREAM)
 serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
 localAddr = ('', 7788)
 serSocket.bind(localAddr)
 serSocket.listen(5)
 try:
  while True:
  print('-----主进程,,等待新客户端的到来------')
  newSocket,destAddr = serSocket.accept()
  print('-----主进程,,接下来创建.个新的进程负责数据处理[%s]-----'
  client = Process(target=dealWithClient, args=(newSocket,destAddr))
  client.start()
  #因为已经向.进程中copy了.份(引.),并且.进程中这个套接字也没有用处了
  #所以关闭
  newSocket.close()
 finally:
  #当为所有的客户端服务完之后再进.关闭,表示不再接收新的客户端的链接
  serSocket.close()
 if __name__ == '__main__':
  main()

通过为每个客户端创建一个进程的方式,能够同时为多个客户端进行服务;当客户端不是特别多的时候,这种方式还行,如果有成百上千个,就不可取了,因为每次创建进程都消耗较多的资源,于是有了改进版

3 多线程服务

采用多线程处理多客户端连接请求,由于线程共享资源,不用像进程那样复制出多个资源,因此处理更快。

#coding=utf-8
from socket import *
from threading import Thread
from time import sleep

# 处理客户端的请求并执行
def dealWithClient(newSocket,destAddr):
 while True:
  recvData = newSocket.recv(1024)
  if len(recvData)>0:
   print('recv[%s]:%s'%(str(destAddr), recvData))
  else:
   print('[%s]客户端已经关闭'%str(destAddr))
   break
 newSocket.close()

def main():
 serSocket = socket(AF_INET, SOCK_STREAM)
 serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
 localAddr = ('', 7788)
 serSocket.bind(localAddr)
 serSocket.listen(5)
 try:
  while True:
   print('-----主进程,,等待新客户端的到来------')
   newSocket,destAddr = serSocket.accept()
   print('-----主进程,,接下来创建.个新的进程负责数据处理[%s]-----'
   client = Thread(target=dealWithClient, args=(newSocket,destAddr))
   client.start()

   #这里不要关闭,线程共享资源,关闭了会导致全部线程均关闭
   #newSocket.close()
 finally:
  serSocket.close()
if __name__ == '__main__':
main()

以上这篇python 简单搭建阻塞式单进程,多进程,多线程服务的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
Python pymongo模块常用操作分析
Sep 01 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
python3.7简单的爬虫实例详解
Jul 08 Python
Python zip函数打包元素实例解析
Dec 11 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
Django一小时写出账号密码管理系统
Apr 29 Python
Python实现归一化算法详情
Mar 18 Python
python套接字socket通信
Apr 01 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 #Python
Python栈算法的实现与简单应用示例
Nov 01 #Python
Python scikit-learn 做线性回归的示例代码
Nov 01 #Python
机器学习python实战之手写数字识别
Nov 01 #Python
Python定时器实例代码
Nov 01 #Python
机器学习python实战之决策树
Nov 01 #Python
详解Python开发中如何使用Hook技巧
Nov 01 #Python
You might like
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
php集成动态口令认证
2016/07/21 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
python映射列表实例分析
2015/01/26 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python线程指南详细介绍
2017/01/05 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
python 如何设置守护进程
2020/10/29 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
家庭户外服装:Hawkshead
2017/11/02 全球购物
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
红领巾广播站广播稿
2014/02/01 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
文员岗位职责范本
2014/03/08 职场文书
openstack云计算keystone组件工作介绍
2022/04/20 Servers
Nginx利用Logrotate实现日志分割
2022/05/20 Servers