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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
Python中input和raw_input的一点区别
Oct 21 Python
介绍Python中的fabs()方法的使用
May 14 Python
解决pycharm界面不能显示中文的问题
May 23 Python
python高阶爬虫实战分析
Jul 29 Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 Python
python使用thrift教程的方法示例
Mar 21 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
python进行参数传递的方法
May 12 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
Jul 01 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 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
PHP生成plist数据的方法
2015/06/16 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
微信小程序嵌入腾讯视频源过程详解
2019/08/08 Javascript
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
在Python程序中实现分布式进程的教程
2015/04/28 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
python实现贪吃蛇游戏
2020/03/21 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
keras中的backend.clip用法
2020/05/22 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
台湾良兴购物网:EcLife
2019/12/01 全球购物
制药工程专业毕业生推荐信
2013/12/24 职场文书
大学秋游活动方案
2014/02/11 职场文书
财产公证书
2014/04/10 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
永远是春天观后感
2015/06/12 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript