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 相关文章推荐
Python3使用requests发闪存的方法
May 11 Python
详解python 发送邮件实例代码
Dec 22 Python
Python使用正则表达式抓取网页图片的方法示例
Apr 21 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
Apr 26 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
Python中IP地址处理IPy模块的方法
Aug 16 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 16 Python
安装PyInstaller失败问题解决
Dec 14 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 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 根据IP地址控制访问的代码
2010/04/22 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
Python应用库大全总结
2018/05/30 Python
详解Python字典的操作
2019/03/04 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
违反学校规定检讨书
2014/01/18 职场文书
房地产项目策划书
2014/02/05 职场文书
行政专员的岗位职责
2014/03/10 职场文书
广播体操比赛口号
2014/06/10 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
解除处分决定书
2015/06/25 职场文书
数学备课组工作总结
2015/08/12 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang