并发编程 , 孤儿进程 , 守护进程

简介: 并发编程 , 孤儿进程 , 守护进程

编程类型

1. 并发 : 当任务数大于cpu核数时 , 在同一时间不同任务交替执行

2.并行 : 当任务数小于cpu核数时 , 任务同时进行

## 同步与异步之间的不同 ##

  1. 同步在需要资源的时候回立即发起请求
  2. 异步不会立即请求而是设置一个时间之后发起请求

## 阻塞与非阻塞的不同 ##

  1. 阻塞会在发起请求后暂停线程
  2. 非阻塞马上请求马上答复继续线程

3.同步( 默认同步阻塞 ) :

       当请求资源时会立即发起请求 , 同时暂停任务等待得到答复后 , 继续任务

4.同步非阻塞 :

       当请求资源时会立即发起请求 , 立即得到答复 , 继续任务执行

5.异步阻塞 :

        当请求资源时 , 会设置一个以后的时间点 , 在这个时间点暂停任务请求资源 ,资源请求完毕后 , 继续任务执行

6.异步( 默认异步非阻塞 ):

        当请求资源时 , 会设置一个以后的时间点 , 在这个时间点立即请求资源 ,得到答复 , 继续执行任务

一.程序和进程

程序 : 一堆不会运行的代码

进程 : 一个正在运行的程序软件

程序调度:

进程执行是由操作系统决定

当进程开启的时候,都要进入就绪队列

进程优先级:

1.先来先服务

   (先到先得)从就绪队列第一个开始排

   

2.短时间优先

   在就绪队列中,选择时间短(开发人员估计)最短时间程序开始执行

3.优先级调度

   在运行时间,当有比较高的优先权的程序任务先进入,就是先执行优先权高的程序

4.时间片转轮调度

   时间片:简单来说就是cpu分配给进程时间,从各个时间片的表面是同步执行,不会浪费cpu资源

   在就绪队列中, 所有程序按照时间片给到时间程序开始执行,但是时间片用完了,继续到就绪队列中开始排队另下一个时间片继续执行

二.创建进程

# 创建进程 python自动自带multiprocessing 创建子进程库

from multiprocessing import  Process

# 创建一个任务(函数)用子进程运行

def func(name):

   print(f"{name}是子进程")

# 进程的调度是安装模板执行,防止进程无限递归调用

# 所有进程都需要用到这个来执行

if __name__ == '__main__':

   print("主进程")

   # 创建实例化Process对象

   """

       Process(target=进程执行任务的名称, args/kwargs:接受任务参数)

   """

   p1 = Process(target=func, args=("张三",))

   p2 = Process(target=func, args=("李四",))

   # 同步阻塞运行

   p1.start()

   p2.start()

三.孤儿进程 , 守护进程

1.孤儿进程

主进程结束 , 子进程继续运行

此时子进程不受主进程控制 , 所以在Python中需要设置main函数 , 当主进程结束后 , 有init收养子进程

2.守护进程

包含两种守护

       1. 设置daemon属性为True 来实现 -- 主进程结束子进程随之结束

               ## 这里的daemon属性必须设置在start前

from multiprocessing import Process

import time

def func(name):

   time.sleep(3)

   print(f"你好, 我是子进程{name}")

if __name__ == '__main__':

   print("我是主进程")

   time.sleep(1)

   p1 = Process(target=func , args=("一号",))

   p2 = Process(target=func , args=("二号",))

 

  # 给子进程一号设置了个daemon属性 , 即为主进程结束子进程一跟着结束 , 子进程     一不受影响

 

   p1.daemon = True    daemon属性要设置在start

   p1.start()

   p2.start()

       2.通过设置join属性来实现 -- 子进程结束后主进程才结束

# 守护进程

from multiprocessing import Process

import time

def func(name):

   print(f"你好, 我是子进程{name}")

   time.sleep(3)

   print("子进程结束")


if __name__ == '__main__':

   print("主进程结束")

   p1 = Process(target=func , args=("一号",))

   p1.start()

   p1.join()

   print("主进程结束")


四.进程数据

在进程中,各个进程数据是隔离,子进程操作的主进程数据,主进程的数据是不会受任何影响

from multiprocessing import Process

age = 10

def func():

   global age

   age += 10

   # 地理隔离, 空间隔离

   print(f"子进程:{age}")

if __name__ == '__main__':

   p1 = Process(target=func)

   p1.start()  

   p1.join()

   print(f"主进程age:{age}")

五.进程类

在Python中自带Process进程类 , 这个类是可以定义修改的 , 通过类的继承来修改类

from multiprocessing import Process

class MyProcess(Process):

   def __init__(self, name):

       super(MyProcess, self).__init__()

       self.name = name

   def eat(self):

       print(f"{self.name}一点都没有听课")

   # --> 没什么用的,就是提示作用:返回一个None,写错None也能继续正常执行

   # def run(self) -> None:

   # run 是自动运行的

   def run(self):

       print(f"{self.name}待会还在问为什么xxx")

       self.eat()

if __name__ == '__main__':

   print("主进程")

   p = MyProcess("xxxx")

   p.start()


相关文章
|
2月前
|
Java 程序员 调度
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
45 1
|
3月前
|
安全 数据安全/隐私保护 数据中心
Python并发编程大挑战:线程安全VS进程隔离,你的选择影响深远!
【7月更文挑战第9天】Python并发:线程共享内存,高效但需处理线程安全(GIL限制并发),适合IO密集型;进程独立内存,安全但通信复杂,适合CPU密集型。使用`threading.Lock`保证线程安全,`multiprocessing.Queue`实现进程间通信。选择取决于任务性质和性能需求。
82 1
|
19天前
|
并行计算 API 调度
探索Python中的并发编程:线程与进程的对比分析
【9月更文挑战第21天】本文深入探讨了Python中并发编程的核心概念,通过直观的代码示例和清晰的逻辑推理,引导读者理解线程与进程在解决并发问题时的不同应用场景。我们将从基础理论出发,逐步过渡到实际案例分析,旨在揭示Python并发模型的内在机制,并比较它们在执行效率、资源占用和适用场景方面的差异。文章不仅适合初学者构建并发编程的基础认识,同时也为有经验的开发者提供深度思考的视角。
|
2月前
|
数据采集 并行计算 安全
Python并发编程:多进程(multiprocessing模块)
在处理CPU密集型任务时,Python的全局解释器锁(GIL)可能会成为瓶颈。为了充分利用多核CPU的性能,可以使用Python的multiprocessing模块来实现多进程编程。与多线程不同,多进程可以绕过GIL,使得每个进程在自己的独立内存空间中运行,从而实现真正的并行计算。
|
2月前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
3月前
|
消息中间件 安全 数据处理
Python中的并发编程:理解多线程与多进程的区别与应用
在Python编程中,理解并发编程是提高程序性能和响应速度的关键。本文将深入探讨多线程和多进程的区别、适用场景及实际应用,帮助开发者更好地利用Python进行并发编程。
|
3月前
|
数据处理 调度 Python
Python并发编程实战指南:深入理解线程(threading)与进程(multiprocessing)的奥秘,打造高效并发应用!
【7月更文挑战第8天】Python并发编程探索:使用`threading`模块创建线程处理任务,虽受限于GIL,适合I/O密集型工作。而`multiprocessing`模块通过进程实现多核利用,适用于CPU密集型任务。通过实例展示了线程和进程的创建与同步,强调了根据任务类型选择合适并发模型的重要性。
48 5
|
3月前
|
数据库 数据安全/隐私保护 C++
Python并发编程实战:线程(threading)VS进程(multiprocessing),谁才是并发之王?
【7月更文挑战第10天】Python并发对比:线程轻量级,适合I/O密集型任务,但受GIL限制;进程绕过GIL,擅CPU密集型,但通信成本高。选择取决于应用场景,线程利于数据共享,进程利于多核利用。并发无“王者”,灵活运用方为上策。
47 2
|
2月前
|
数据采集 并行计算 程序员
Python中的并发编程:理解多线程与多进程
在Python编程中,理解并发编程是提升程序性能和效率的关键。本文将深入探讨Python中的多线程和多进程编程模型,比较它们的优劣势,并提供实际应用中的最佳实践与案例分析。
|
3月前
|
安全 API 调度
深度剖析:Python并发编程中的线程与进程,那些你不可不知的使用技巧与限制!
【7月更文挑战第9天】Python并发:线程适合IO密集型任务,利用GIL下的多线程同步,如示例中使用锁。进程适用于CPU密集型,通过multiprocessing模块实现多进程,利用进程间通信如队列。线程受限于GIL,进程间通信成本高。选择取决于任务需求和性能目标。
31 2

相关实验场景

更多