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 相关文章推荐
python中enumerate的用法实例解析
Aug 18 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
在Python中使用poplib模块收取邮件的教程
Apr 29 Python
Python实现简单字典树的方法
Apr 29 Python
深入理解Python变量与常量
Jun 02 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
python爬虫实现获取下一页代码
Mar 13 Python
详解Python中import机制
Sep 11 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
Python基础之元组与文件知识总结
May 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
php中的boolean(布尔)类型详解
2013/10/28 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
php压缩文件夹最新版
2018/07/18 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
javascript常用方法汇总
2014/12/02 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
Python实现队列的方法
2015/05/26 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
银行实习的自我鉴定
2013/12/10 职场文书
学历公证书范本
2014/04/09 职场文书
物理课外活动总结
2014/08/27 职场文书
2015年双拥工作总结
2015/04/08 职场文书
长江七号观后感
2015/06/11 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书