Python多进程与服务器并发原理及用法实例分析


Posted in Python onAugust 21, 2018

本文实例分析了Python多进程与服务器并发原理及用法。分享给大家供大家参考,具体如下:

进程

什么是进程

进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。

进程与程序的区别

程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。

并发与并行

无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务

一 并发:是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)

二 并行:同时运行,只有具备多个cpu才能实现并行

单核下,可以利用多道技术,多个核,每个核也都可以利用多道技术(多道技术是针对单核而言的

有四个核,六个任务,这样同一时间有四个任务被执行,假设分别被分配给了cpu1,cpu2,cpu3,cpu4,

一旦任务1遇到I/O就被迫中断执行,此时任务5就拿到cpu1的时间片去执行,这就是单核下的多道技术

而一旦任务1的I/O结束了,操作系统会重新调用它(需知进程的调度、分配给哪个cpu运行,由操作系统说了算),可能被分配给四个cpu中的任意一个去执行

同步与异步

同步执行:一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行

异步执行:一个进程在执行某个任务时,另外一个进程无需等待其执行完毕,就可以继续执行,当有消息返回时,系统会通知后者进行处理,这样可以提高执行效率

举个例子,打电话时就是同步通信,发短息时就是异步通信。

进程的创建

但凡是硬件,都需要有操作系统去管理,只要有操作系统,就有进程的概念,就需要有创建进程的方式,一些操作系统只为一个应用程序设计,比如微波炉中的控制器,一旦启动微波炉,所有的进程都已经存在。

而对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力,主要分为4中形式创建新的进程

1. 系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印)

2. 一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)

3. 用户的交互式请求,而创建一个新进程(如用户双击暴风影音)

4. 一个批处理作业的初始化(只在大型机的批处理系统中应用)

无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的:

1. 在UNIX中该系统调用是:fork,fork会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(在shell解释器进程中,执行一个命令就会创建一个子进程)

2. 在windows中该系统调用是:CreateProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新进程。

关于创建的子进程,UNIX和windows

1.相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。

2.不同的是:在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说,从一开始父进程与子进程的地址空间就是不同的。

进程的终止

1. 正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)

2. 出错退出(自愿,python a.py中a.py不存在)

3. 严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常,try...except...)

4. 被其他进程杀死(非自愿,如kill -9)

一个进程由三种状态

Python多进程与服务器并发原理及用法实例分析

重点来了

python并发编程之多进程

multiprocessing模块介绍

python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing。

multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。

multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内

Process类的介绍

创建进程的类:

Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)

强调:

1. 需要使用关键字的方式来指定参数
2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号

  • group参数未使用,值始终为None
  • target表示调用对象,即子进程要执行的任务
  • args表示调用对象的位置参数元组,args=(1,2,'egon',)
  • kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
  • name为子进程的名称

p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置

p.name:进程的名称

p.pid:进程的pid

p.exitcode:进程在运行时为None、如果为?N,表示被信号N结束(了解即可)

p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

开启子进程

import time
import random
from multiprocessing import Process
def piao(name):
  print('%s piaoing' %name)
  time.sleep(random.randrange(1,5))
  print('%s piao end' %name)
p1=Process(target=piao,args=('egon',)) #必须加,号
p2=Process(target=piao,args=('alex',))
p3=Process(target=piao,args=('wupeqi',))
p4=Process(target=piao,args=('yuanhao',))
p1.start()
p2.start()
p3.start()
p4.start()
print('主线程')

开启子进程2

import time
import random
from multiprocessing import Process
class Piao(Process):
  def __init__(self,name):
    super().__init__()
    self.name=name
  def run(self):
    print('%s piaoing' %self.name)
    time.sleep(random.randrange(1,5))
    print('%s piao end' %self.name)
p1=Piao('egon')
p2=Piao('alex')
p3=Piao('wupeiqi')
p4=Piao('yuanhao')
p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
print('主进程')

socket服务器并发

from socket import *
from multiprocessing import Process
server=socket(AF_INET,SOCK_STREAM)
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
server.bind(('127.0.0.1',8080))
server.listen(5)
def talk(conn,client_addr):
  while True:
    try:
      msg=conn.recv(1024)
      if not msg:break
      conn.send(msg.upper())
    except Exception:
      break
if __name__ == '__main__': #windows下start进程一定要写到这下面
  while True:
    conn,client_addr=server.accept()
    p=Process(target=talk,args=(conn,client_addr))
    p.start()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
Jan 09 Python
python爬取各类文档方法归类汇总
Mar 22 Python
python中subprocess批量执行linux命令
Apr 27 Python
python检测IP地址变化并触发事件
Dec 26 Python
Python之列表实现栈的工作功能
Jan 28 Python
Python GUI编程完整示例
Apr 04 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
python启动应用程序和终止应用程序的方法
Jun 28 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
Aug 02 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
Elasticsearch 数据类型及管理
Apr 19 Python
Python socket实现的简单通信功能示例
Aug 21 #Python
Python多进程原理与用法分析
Aug 21 #Python
python安装twisted的问题解析
Aug 21 #Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 #Python
Python多线程原理与用法详解
Aug 20 #Python
Python模拟简单电梯调度算法示例
Aug 20 #Python
django_orm查询性能优化方法
Aug 20 #Python
You might like
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
PHP7 windows支持
2021/03/09 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
Python专用方法与迭代机制实例分析
2014/09/15 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
详解python的变量缓存机制
2021/01/24 Python
Python 图片处理库exifread详解
2021/02/25 Python
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
师范毕业生自荐信
2013/10/17 职场文书
应届毕业生个人自荐信范文
2013/11/30 职场文书
工程专业应届生求职信
2014/02/19 职场文书
合伙协议书范本
2014/04/21 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
办公用房租赁协议书
2014/11/29 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript