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装饰器
May 09 Python
Python中的with...as用法介绍
May 28 Python
Python过滤列表用法实例分析
Apr 29 Python
Python实现约瑟夫环问题的方法
May 03 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
django celery redis使用具体实践
Apr 08 Python
Django中ORM外键和表的关系详解
May 20 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
Python读取yaml文件的详细教程
Jul 21 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 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 socke 向指定页面提交数据
2008/07/23 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
jquery之Document元素选择器篇
2008/08/14 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
2013/11/01 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
JavaScript字符串转数字的简单实现方法
2020/11/27 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
Python中一些不为人知的基础技巧总结
2018/05/19 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
请介绍一下Ant
2016/07/22 面试题
大学生开西餐厅创业计划书
2014/02/01 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
学雷锋倡议书
2015/01/19 职场文书
英语教师求职信范文
2015/03/20 职场文书
python中subplot大小的设置步骤
2021/06/28 Python