1.今日内容大纲

  1. 进程的介绍(理论部分)

  2. 进程的创建以及分析

  3. 获取进程的pid

  4. 进程之间的隔离

1.进程的介绍(理论部分)

1.1什么是进程

一个正在被cpu执行的程序就是一个进程,一个程序可以开启多个进程。

1.2 串行、并发、并行

1.2.1 串行

程序一个一个的被执行,同一时刻cpu只能执行一个程序。

1.2.2 并行

并行是同时运行多个程序,一个cpu运行一个程序,如果4个cpu同时运行4个程序。

1.2.3 并发

伪并行,看起来像是同时运行,其实是cpu在不同的任务间来回切换。多道技术。

  • 谁的效率最高?

    并行的效率最高。

  • 除去并行,直说串行和并发,谁的效率高?

    如果多个任务都是计算密集型,串行的效率高。

    如果IO密集型的任务居多,并发的效率高。

1.3 阻塞、非阻塞

  • 阻塞

    程序运行中由于某种原因(input,accept等)使得程序夯住,等待一段时间之后(获取到了结果之后),再继续运行。如果阻塞了,操作系统会将cpu从此任务中切换到执行其他的任务。

  • 非阻塞

    程序运行开始至结束中途无需等待结果(停住)。

1.4 进程的创建

无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的:(言外之意,一个进程的创建一定是基于一个父进程)

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

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

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

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

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

1.5 进程的三个状态

进程的三个状态:运行,阻塞,就绪。

2.python的并发编程之多进程

2.1创建进程的两种方式

  • 引子

    我们之前写的那些项目,模拟博客园,ATM,教务管理系统等等都是一个程序,只有socket才是开启了多个进程进行操作。

  • 函数式开启进程的方式

     from multiprocessing import Process
     ​
     ​
     def task(a):
      print('in task')
      return a + 1
     ​
     ​
     if __name__ == '__main__': # windows系统下,开启多进程一定要配置这行代码。
     ​
      p1 = Process(target=task, args=(100,)) # 创建一个子进程对象
      p1.start() # 通知操作系统在内存中开辟一个子进程空间,将主进程所有的资源深copy一份放置到子进程空间中
      print('=====主')
     ​
     ​
     ​
     # import time
     # a = 1
     # b = 2
     # print(a + b)
     # time.sleep(2)
     # print(666)
    • 为什么主进程先执行,而子进程后执行?

      当p.start执行时,内存中马上开辟一个空间,创建一个子进程,此时cpu对应的就是在主子进程之间选择切换,由于子进程还需要加载数据等,遇到了阻塞,所以先执行主进程,这也说明了开启进程的开销相对较大。

  • 面向对象开启进程方式

     # from multiprocessing import Process
     # import time
     #
     # def task(a):
     # print('in task')
     # return a + 1
     #
     #
     # if __name__ == '__main__': # windows系统下,开启多进程一定要配置这行代码。
     #
     # p1 = Process(target=task, args=(100,)) # 创建一个子进程对象
     # p1.start() # 通知操作系统在内存中开辟一个子进程空间,将主进程所有的资源深copy一份放置到子进程空间中
     # time.sleep(1)
     # print('=====主')
     ​
     ​
     ​
     # import time
     # a = 1
     # b = 2
     # print(a + b)
     # time.sleep(2)
     # print(666)
     ​
     ​
     from multiprocessing import Process
     import time
     ​
     class MyProcess(Process):
     ​
      def __init__(self, name):
      super().__init__()
      self.name = name
     ​
      def run(self): # 子进程的任务
      print(f'{self.name}开始运行了')
      time.sleep(2)
      print(f'{self.name}子进程结束了')
     ​
     ​
     if __name__ == '__main__':
     ​
      p1 = MyProcess('玮哥')
      p1.start()
      time.sleep(1)
      print('=====主')

    注意:在windows中Process()必须放到# if name == 'main':下

     Since Windows has no fork, the multiprocessing module starts a new Python process and imports the calling module. 
     If Process() gets called upon import, then this sets off an infinite succession of new processes (or until your machine runs out of resources).
     This is the reason for hiding calls to Process() inside
     ​
     if __name__ == "__main__"
     since statements inside this if-statement will not get called upon import.
     由于Windows没有fork,多处理模块启动一个新的Python进程并导入调用模块。
     如果在导入时调用Process(),那么这将启动无限继承的新进程(或直到机器耗尽资源)。
     这是隐藏对Process()内部调用的原,使用if __name__ == “__main __”,这个if语句中的语句将不会在导入时被调用。
     ​
     详细解释

python 网络并发 :理论部分的更多相关文章

  1. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  2. python网络编程——IO多路复用之select

    1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...

  3. 笔记之Python网络数据采集

    笔记之Python网络数据采集 非原创即采集 一念清净, 烈焰成池, 一念觉醒, 方登彼岸 网络数据采集, 无非就是写一个自动化程序向网络服务器请求数据, 再对数据进行解析, 提取需要的信息 通常, ...

  4. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  5. 156个Python网络爬虫资源

    本列表包含Python网页抓取和数据处理相关的库. 网络相关 通用 urllib - 网络库(标准库) requests - 网络库 grab - 网络库(基于pycurl) pycurl - 网络库 ...

  6. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  7. python多进程并发和多线程并发和协程

    为什么需要并发编程? 如果程序中包含I/O操作,程序会有很高的延迟,CPU会处于等待状态,这样会浪费系统资源,浪费时间 1.Python的并发编程分为多进程并发和多线程并发 多进程并发:运行多个独立的 ...

  8. 使用Python进行并发编程

    让计算机程序并发的运行是一个经常被讨论的话题,今天我想讨论一下Python下的各种并发方式. 并发方式 线程(Thread) 多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具( ...

  9. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

随机推荐

  1. 《Clojure编程》笔记 第1章 进入Clojure仙境

    目录 背景简述 第1章 进入Clojure仙境 1.1 基础概念 1.2 常用的一些符号 背景简述 本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Cloj ...

  2. (C#2,.net framework2.0,Visual Studio 2003)之前版本

    (C#2,.net framework2.0,Visual Studio 2003)之前版本归为最初的版本(主要是针对.net framework),其主要定义了最基本的类型.特性. 1.基本的类型 ...

  3. logback日志打印sql

    今天整合springboot2 + mybatis + logback 遇到了在日志中sql打印不出来的坑,在网上找了好久,都不是我遇到的问题,这里吐槽一下下现在的博客质量,好多都是抄袭的,也没有标注 ...

  4. 服务器断电导致的ORACLE异常 : ORA-00214 ORA-01033 ORA-01034 ORA-00172 ORA-27101

    工作环境中的集群迁移之后,oracle出了挺多问题,最开始一直没找到原因,后来发现做迁移的人是冷迁移的,且数据库节点是硬关机的,惊了( 表现症状有不能登陆,登录了不能操作等 第一个报的是 ORA-00 ...

  5. 绝对定位元素left、right、top、bottom值与其margin和宽高的关系

    绝对定位元素(position: absolute)在其相对定位元素(即文档流中最近的非静态定位祖先元素)中,定位祖先元素的宽度为W,垂直高度为H,则存在以下关系: 元素水平方向 width + le ...

  6. Quirc二维码识别模块

    背景 师兄要用这个参加集赛,但是说自己C语言不太行,花了一个多小时帮他分析了一下(虽然自己也不太行). 对应模块的GitHub地址:https://github.com/dlbeer/quirc. 记 ...

  7. spring中的数据库操作类

    例子一: package cn.itcast.service.impl; import java.util.List; import javax.sql.DataSource; import org. ...

  8. bluestore对象挂载到系统进行提取

    前言 之前在filestore里面,pg是直接暴露到文件系统的,也就是可以直接进去查看或者拷贝,在极端情况下,多个osd无法启动,pg无法导出的时候,那么对pg内部对象的操作处理,是可以作为最后恢复数 ...

  9. 调整PG分多次调整和一次到位的迁移差别分析

    前言 这个问题来源于我们研发的一个问题,在进行pg调整的时候,是一次调整到位好,还是分多次调整比较好,分多次调整的时候会不会出现某个pg反复挪动的问题,造成整体迁移量大于一次调整的 最近自己的项目上也 ...

  10. [web安全原理分析]-文件上传漏洞基础

    简介 前端JS过滤绕过 待更新... 文件名过滤绕过 待更新 Content-type过滤绕过 Content-Type用于定义网络文件的类型和网页编码,用来告诉文件接收方以什么形式.什么编码读取这个 ...