Python核心开发知识(进程的理解)

欢迎各位小哥哥小姐姐阅读本<小生>的文章,对大家学习有帮助,请点赞加关注哦!!!!!!!!!!!

您的点赞和关注将是我持续更新的动力呢.^v^

有不懂的问题可以私聊我哦!

1.进程和线程:

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念;
进程是程序在处理机上的一次执行过程,它是一个动态的概念;
程序可以作为一种软件资料长期存在;而进程是有一定生命期的,是暂时的;
​
线程是最小的执行单元,不能独立执行, 必须依存在进程中,而进程由至少一个线程组成;
多进程中,每个进程中所有数据(包括全局变量)都各有拥有一份,互不影响;
多线程中,所有线程共享进程的内存;

优缺点:

线程执行开销小,但不利于资源的管理和保护;而进程正相反。

用途:

多线程多用于io密集型操作(io意味着出现阻塞)

多进程多用于cpu密集型运算(没有阻塞)

2.进程的创建:

import multiprocessing
import os
​
def run_proc(name):
 print('子进程运行中,name= %s ,pid=%d...' % (name, os.getpid())) # getpid()获取当前进程号 getppid()获取当前进程的父进程号
​
p = multiprocessing.Process(target=run_proc, args=('test',))
p.start()

使用继承的方式创建进程:

from multiprocessing import Process
import time
​
# 继承Process类
class NewProcess(Process): 
 # 重写__init__方法
 def __init__(self, num):
 super(MyThread, self).__init__() # 注意super()方法的格式
 self.num = num 
​
 # 重写run方法
 def run(self): 
 for i in range(self.num):
 print("子进程")
 time.sleep(0.5)
def main():
 p = NewProcess(5)
 # 调用p.start()方法,然后在Process的start方法中调用run方法
 p.start()
if __name__ == '__main__':
 main()

3.进程间通信:

from multiprocessing import Queue

q=Queue(3) # 初始化一个Queue对象,若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头)
q.put("消息1") 
q.get()

4.进程池的创建:

# 导入multiprocessing中的Poll方法
from multiprocessing import Pool
​
def worker(msg):
 pass
 
po=Pool(3) # 定义一个进程池,最大进程数3
po.apply_async(要调用的目标,(传递给目标的参数元祖,))
​
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后

5.进程池中的进程通信:

# 修改import中的Queue为Manager

from multiprocessing import Manager,Pool

q = Manager().Queue() # 使用Manager中的Queue
po = Pool() # 定义进程池
​
q.put("消息1") 
q.get()

解耦(了解):

高内聚低耦合:是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。
​
耦合性:也称块间联系。
 指软件系统结构中各模块间相互联系紧密程度的一种度量。
 模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
 
内聚性:又称块内联系。
 指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。
 若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。
 
高内聚:是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
​
耦合:一个软件结构内不同模块之间互连程度的度量。
​
低耦合:一个完整的系统,模块与模块之间,尽可能的使其独立存在。
 也就是说,让每个模块,尽可能的独立完成某个特定的子功能。
 模块与模块之间的接口,尽量的少而简单。
 如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。
 
解耦:尽可能减少代码耦合。

相关推荐