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 + openpyxl处理excel2007文档思路以及心得
Jul 14 Python
Python简单删除目录下文件以及文件夹的方法
May 27 Python
Python的Django框架下管理站点的基本方法
Jul 17 Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
浅析python中的迭代与迭代对象
Oct 08 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
基于Tensorflow高阶读写教程
Feb 10 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
python性能测试工具locust的使用
Dec 28 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
PHP小教程之实现双向链表
2014/06/12 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
js鼠标左右键 键盘值小结
2010/06/11 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
Python urllib.request对象案例解析
2020/05/11 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
python 检测图片是否有马赛克
2020/12/01 Python
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
opencv检测动态物体的实现
2021/07/21 Python