并发进程(代码片段)

0627zhou 0627zhou     2022-12-24     549

关键词:

1.计算机硬件和操作系统

  1. 计算机硬件组成:

 

    • 主板:固化(寄存器,是直接和cpu进行交互的一个硬件)
    • cpu:中央处理器,能够进行数学运算和一些逻辑运算,并且控制所有硬件协调工作
    • 存储:硬盘和内存
    • 输入设备:键盘,鼠标,话筒
    • 输出设备:显示器,音响,打印机

 

  • 早期的计算机是以计算为核心的
  • 现在的计算机是以存储为核心的

  2.计算机操作系统:

    • 操作系统是一个软件,是一个能直接操纵硬件的一个软件
    • 它的目的是让用户用起来更加的轻松,高可用,低耦合;
    • 几个代表性系统:dos  windows unix

操作系统的作用:

  • 封装所有硬件接口,让各种用户使用电脑更加轻松;
  • 是对计算机内所有的资源进行合理的调度和分配; 

2.进程的理论

  1. 几个后缀文件:

 

    • .sh  shell脚本文件
    • .out linux系统中的可执行文件
    • .bat 批处理脚本文件
    • .lib 库文件
    • .dll 库
    • .exe 可执行文件

  2.进程:

    • 是指正在执行的程序;
    • 是程序执行过程中的一次指令
    • 也可以叫做程序的一次执行过程
    • 进程是一个动态的概念

  3.进程三大部分组成:代码段,数据段,PCB:进程管理调度

  4.进程的三大基本状态

    • 就绪状态:已经获得运行需要的所有资源,除了cpu
    • 执行状态:已经获得了所有资源包括cpu,处于正在执行
    • 阻塞状态:因为各种原因,进程放弃了cpu,导致进程无法继续执行;此时进程处于内存中,继续等待获取cpu
    • 因为各种原因,进程放弃了cpu,导致进程无法继续执行,此时进程被踢出内存;

3.关于进程的一些名词

  • 并行:是指两者同时执行,一定是多个车道,在同一时间点
  • 并发:是指在资源有限的情况下,两者轮流使用资源,只有一条赛道
  • 同步:就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,才能继续进行,是可靠的任务序列,要么成功都成功,失败都失败,两个任务的状态可以保持一致;
  • 异步:不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也会立即执行,至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠序列;
  • 技术分享图片
    同步:比如你去商店买书,你问老板有没有<古龙小说集>,老板说我给你查查,然后你就一直等,有可能等一天,有可能等一个小时,必须等到一个结果,你才去进行下一步;
    
    异步:还是你去买书,你问老板有没有,老板说,你先回去吧,我帮你查查,有了电话通知你,你得到一个结果,可是这个结果并不是真实的结果,只是一个反馈结果而已;
    
    阻塞:还是买书,你问老板有没有,老板说我帮你查查,然后你会一直在等,等到天荒地老,什么也不干,等一个结果;
    
    非阻塞:还是买书,你问老板有没有,老板说我帮你查查,你说老板你先查着,我先玩一会,然后你一会在过来看看;
    例子
  • 阻塞与非阻塞:阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的
  • 技术分享图片
    同步阻塞形式
      效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。
    
    异步阻塞形式
      如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;
    
      异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
    
    同步非阻塞形式
      实际上是效率低下的。
    
      想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有(两个操作不能同时执行,因为是同步),如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
    
    异步非阻塞形式
      效率更高,
    
      因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。
    
      比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。
    四个名词

4. multiprocessing.Process模块

1.进程两种开启方式:实例化一个进程的对象:

def func():
    print(子进程1的爸爸是%s,我是%s % (os.getppid(),os.getpid()))
def func2():
    print(子进程2的爸爸是%s,我是%s % (os.getppid(), os.getpid()))

if __name__ == __main__:
    li = [func, func2]
    for i in li:
        p = Process(target=i)
        p.start()
    print(主进程的爸爸是%s,我自己是%s % (os.getppid(),os.getpid()))

#主进程的爸爸是1116,我自己是12760
子进程1的爸爸是12760,我是848
子进程2的爸爸是12760,我是11588

2.通过继承

class Myprocess(Process):
    def __init__(self,name):
        super(Myprocess, self).__init__()
        self.name = name
    def run(self):
        print(这是以继承类的方式开启的子进程%s,他的名字是%s %(os.getppid(),self.name))

if __name__ == __main__:
    p = Myprocess(alex)
    p.start()
    print(这里是主进程%s % os.getpid())

3.进程的常用方法

  1. start() 开启一个子进程
  2. join() 异步变同步(就是让父进程停留在join这句话,等待子进程执行结束)
  3. is_alive()判断进程是否还活着
  4. terminate()杀死进程

每个方法的代码演示:

 

技术分享图片
from multiprocessing import Process
import time

def func():
    for i in range(500):
        time.sleep(0.01)
        print(儿子在这里)

if __name__ == __main__:
    p = Process(target=func)
    p.start()
    p.join()# 是让主进程等待子进程执行完。  现象:主进程执行到这句话,主进程阻塞住,等待子进程执行
    for i in range(100):
        time.sleep(0.01)
        print(爸爸在这里)

# 开启一个正常的子进程,父进程会等待子进程结束后,父进程也就是程序才结束
# p.join()# 是让主进程等待子进程执行完。  现象:主进程执行到这句话,主进程阻塞住,等待子进程执行
# 如何把父进程和子进程之间的关系变为同步或者异步?
# 父进程执行join,就会变成同步,不执行join,父进程和子进程就是异步的关系
# join必须放在start()后边
join和start

 

技术分享图片
from multiprocessing import Process
import time


def func():
    time.sleep(1)
    print(123)


if __name__ == __main__:
    p = Process(target=func,)
    p.start()
    p.terminate()# 杀死p进程,让解释器告诉操作系统,请杀掉p进程。
    print(子进程是否还活着?, p.is_alive())
    time.sleep(0.002)
    print(子进程是否还活着?, p.is_alive())
    # 返回一个bool值,如果返回True,代表进程还活着,如果返回False,代表子进程死了

# p.is_alive() 判断p进程是否还活着
# p.terminate() 杀死p进程
is_alive和terminate

4.进程的常用属性

  • p.name = 给p进程的一个名字
  • p.pid = 返回p进程的pid
  • p.daemon = True 将p进程设置为守护进程(True为守护进程,False为普通进程)
    • 守护进程的两个特点:
    • 守护进程会随着父进程的结束而结束
    • 守护进程不能再创建子进程(不能有孩子)

 

技术分享图片
from multiprocessing import Process
import time
def func():
    for i in range(10):
        time.sleep(1)
        print(time.strftime("%H:%M:%S"))
if __name__ == __main__:
    #设置为守护进程后,会根据主进程想要的效果停止的子进程
    p = Process(target=func)
    p.daemon = True
    p.start()
    time.sleep(5)
    print(计时结束!)
#输出结果
20:15:49
20:15:50
20:15:51
20:15:52
20:15:53
20:15:54
计时结束!
守护进程的作用
技术分享图片
from multiprocessing import Process
import time
import os

def func():
    print(这里是儿子,儿子的pid是%s%(os.getpid()))

if __name__ == __main__:
    p = Process(target=func)
    p.start()
    p.name = alex
    print(儿子的名字是%s%p.name)
    print(儿子的pid是%s%p.pid)
    print(儿子是不是守护进程?,p.daemon)
其他属性

 

并发编程(代码片段)

一、多进程并发和多线程并发多进程并发有进程间通信机制,更加安全。第一个缺点:进程间通信为避免一个进程修改另一个进程,比如读时共享写时复制使得花销更大;第二个缺点:需要启动进程,还要系统内核来管理进程,... 查看详情

并发编程进程基础(代码片段)

...只会在就绪和运行状态中切换进程三状态:就绪运行阻塞并发并行并发是包含并行的并发:宏观上多个程序同时运行,实际是同一时间只运运行了一次并行:微观上多个程序同时运行子进程和主进程pidppid多并发的tcp服务端importso 查看详情

并发编程4(代码片段)

守护进程    语法:obj.daemon=True    必须放在obj.start()之前  特点:守护进程内无法在开启子进程,否则抛出异常。AssertionError:daemonicprocessesarenotallowedtohavechildren       父进程代码执行结束守护进程也必须... 查看详情

并发编程——进程(代码片段)

 一、什么是进程进程其实一个资源单位,而进程内的线程才是cpu上的执行单位,线程其实指的就是代码的执行过程二、进程和线程的区别1.同一进程下的多个线程共享该进程内的资源2.创建线程的开销要远远小于进程三、利... 查看详情

并发编程之——多进程(代码片段)

...进程。另外同一个程序执行两次就是两个进程了。  1.2并发与并行  无论是并行还是并发,在用户看来都是‘同时‘运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时... 查看详情

并发编程---进程(代码片段)

...有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一 查看详情

java并发编程之美之并发编程线程基础(代码片段)

什么是线程  进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程至少有一个线程,进程的多个线程共享进程的资源。  java启动main函数其实就是启动... 查看详情

并发编程——开启进程(代码片段)

 一、multiprocessing模块 1、multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。 2、multiprocessing模块的功能众多:支持子进程、通信和共享数... 查看详情

多进程并发(代码片段)

importsocketfrommultiprocessingimportProcessdefserver(conn):msg=‘连接成功‘.encode(‘utf-8‘)conn.send(msg)msg2=conn.recv(1024).decode(‘utf-8‘)print(msg2)conn.close()if__name__==‘__main__‘:sk=socket.socket() 查看详情

python:并发编程(代码片段)

Python并发编程Python并发编程创建子进程进程池队列进程之间的通信线程线程锁线程同步网络编程IP地址与端口端口网络通信协议TCP/UDP套接字编程TFTP文件下载器Python并发编程代码编写完没有运行称之为程序,正在运行的代码就... 查看详情

并发编程(代码片段)

前言经过前一篇博客的学习了解了Unix和Windows系统创建进程的方式了,对于Unix系统来说,会把父进程的数据直接拷贝一份到子进程的内存空间;而Windows系统会重新加载一遍父进程的代码.那么在python中怎么创建进程呢?其实也是调用了... 查看详情

并发编程:进程池,多线程。(代码片段)

一守护进程的应用:其实还是在我们生产者与消费者的模型上加上守护进程的概念,使得我们的进程能够在任务执行完之后正常的退出。importtimeimportrandomfrommultiprocessingimportProcess,JoinableQueue#我们在这里导入一个joinableQueue模块,de... 查看详情

linux高并发服务器(代码片段)

高并发服务器一、多进程并发服务器  1.实现示意图  2.使用多进程并发服务器时要考虑以下几点:父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符)系统内创建进程个数(与内存大小相关)进... 查看详情

并发编程之线程(代码片段)

...分配需要时间,占用的空间也比较大 二、线程随着对并发的要求越来越高,无限开启进程是不现实的,解决高并发下进程的问题,使用线程。线程是轻量级的概念,它没有属于自己的进程资源一条线程只负责执行代码,没有... 查看详情

并发编程--进程(代码片段)

内容目录1.前提介绍操作系统发展史多道技术2.进程进程介绍进程调度进程状态转换同步与异步,阻塞与非阻塞创建进程的两种方式join方法进程间的数据隔离与通信进程对象的其他相关方法僵尸进程与孤儿继承守护进程互斥锁一... 查看详情

并行并发(代码片段)

进程Process进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线... 查看详情

python并发进程—multiprocessing模块创建进程(代码片段)

multiprocessing模块创建进程进程创建方法1.流程特点【1】将需要子进程执行的事件封装为函数【2】通过模块的Process类创建进程对象,关联函数【3】可以通过进程对象设置进程信息及属性【4】通过进程对象调用start启动进程【5】... 查看详情

nginx多进程+io多路复用实现高并发(代码片段)

一、nginx高并发原理简单介绍:nginx采用的是多进程(单线程)+io多路复用(epoll)模型实现高并发二、nginx多进程启动nginx解析初始化配置文件后会创建(fork)一个master进程之后这个进程会退出master进程会变为孤儿进程由init进程托... 查看详情