python进程

news2024/12/24 9:02:11

队列

简介

在windows中,启动一个程序+资源等于一个进程,进程是由多个线程组成的,进程理解为管理层,而线程是工人

通俗解释:

  • 进程:能够完成多任务,比如,在同一台电脑上能够同时运行多个QQ
  • 线程:能够完成多任务,比如,一个qq中的多个聊天窗口

进程与线程:

定义不同

  • 进程是系统进行资源分配和调度的一个独立单位
  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源

区别

  • 一个程序至少有一个进程,一个进程至少有一个线程
  • 线程的划分尺度小于进程(资源比进程小),使得多线程程序的并发性高
  • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,而从极大地提升了程序的运行效率
  • 线程不能独立执行,必须依存于进程中
  • 可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线的工人

优缺点
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护,而进程正相反


进程之间不共享全局变量

  1. 当创建一个子进程的时候,会复制父进程的很多东西(全局变量)
  2. 子进程和主进程是单独的两个进程,不是一个
    1. 当一个进程结束的时候,不会对其他的进程产生影响
      线程之间共享全局变量
    2. 所有的线程都在同一个进程中,这个进程是主进程

在这里插入图片描述

实现方法

无输入输出

from mulitprocessing import Process
import time

def test():
    while True:
        print("--test--")
        time.sleep(1)
        
        
class MyProcess(Process):
    def run(self):
        while True:
            print("myprocess")
            time.sleep(1)
    

if __name__ == "__main__":
    p = Process(target=test)
    p1 = MyProcess()
    
    p.start()
    p1.start()
    
    while True:
        print("--main--")
        time.sleep(1)

有输入无输出

from multiprocessing import Process
import time

def test(*args, **kwargs):
    while True:
        print(args[0], "->", kwargs['num2'])
        time.sleep(1)
        
        
class MyProcess(Process):
    def __init__(self, num1, num2) -> None:
        super().__init__()
        self.num1 = num1
        self.num2 = num2
        
    def run(self) -> None:
        while True:
            print(self.num1 + self.num2)
            time.sleep(1)
    

if __name__ == "__main__":
    p = Process(target=test, args=(1,), kwargs={'num2':2})
    p1 = MyProcess(1, 2)
    
    p.start()
    p1.start()
    
    while True:
        print("--main--")
        time.sleep(1)

有输入有输出

def test(*args, **kwargs):
    que = kwargs['que']
    for value in ['A', 'B', 'C']:
        que.put(value)
                
        
class MyProcess(Process):
    def __init__(self, que) -> None:
        super().__init__()
        self.que = que
        
    def run(self) -> None:
        while True:
            time.sleep(0.5)
            if not self.que.empty():
                value = self.que.get()
                print('Get %s from queue.' % value)
            else:
                break

def main():
    q = Queue()
    p = Process(target=test, args=(1,), kwargs={'num2':2, 'que': q})
    p1 = MyProcess(q)
    
    p.start()
    p1.start()

进程池

限制进程数(创建一个进程和杀死一个进程时间效率较低),重复利用进程,来保证计算机进程的效率

from multiprocessing import Pool
import os
import time

def worker(num):
    for i in range(5):
        print(f"===pid={os.getpid()}===num={num}=")
        time.sleep(1)
        
def main():
    # 3表示进程中最多有3个进程一起执行
    pool = Pool(3)

    for i in range(10):
        print(f'-----{i}-----')

        # 向进程池中添加任务
        pool.apply_async(worker, args=(i,))
        
    pool.close() # 关闭进程池
    pool.join() # 主进程在这里等待,只有子进程全部结束之后,再会开启主进程,同时可以回收进程资源
    
if __name__ == "__main__":
    main()

在Python中,Pool.apply()和Pool.apply_async()都可用于实现子进程的并行处理,但它们之间确实存在一些区别:

阻塞:Pool.apply()将阻塞主进程,直到进程池中的所有任务都完成。而Pool.apply_async()不会阻塞进程,它会立即返回一个AsyncResult对象,并在后台异步执行进程任务。

返回结果:Pool.apply()方法会返回进程的执行结果,因此必须等到子进程执行完再返回结果。而Pool.apply_async()方法不会立即返回结果,但可以立即得到一个AsyncResult对象,并且可以通过调用AsyncResult.get()方法获取对应进程的执行结果。

并行度:Pool.apply()方法是串行处理任务的,但Pool.apply_async()方法可以并行处理多个任务,可以更快的执行一些任务。

因此,如果需要在主进程中等待所有进程任务完成并获取结果,可以使用Pool.apply()。而如果不需要阻塞主进程并且想要更高的并行处理率,建议使用Pool.apply_async()。

from multiprocessing import Pool
import time

def square(num):
    time.sleep(1)  # 模拟耗时操作
    return num * num

if __name__ == '__main__':
    nums = [1, 2, 3, 4, 5]
    with Pool(processes=4) as pool:
        results = []
        for num in nums:
            result = pool.apply_async(square, args=(num,))
            results.append(result)

        # 获取结果
        for result in results:
            print(result.get())

进程池通信

使用Manager中的Pool

from multiprocessing import Manager, Pool
import time
import os

def reader(q):
    print(f'reader启动({os.getpid()}), 父进程为({os.getppid()})')
    for i in range(q.qsize()):
        print(f'reader从Queue获取到消息:{q.get()}')
        
def write(q):
    print(f'wirter启动({os.getpid()}), 父进程为({os.getppid()})')
    for i in "itcast":
        q.put(i)
        
if __name__ == "__main__":
    print(f"({os.getpid()}) start")
    q = Manager().Queue()
    po = Pool()
    po.apply_async(write, (q,))
    
    time.sleep(1)

    po.apply_async(reader, (q,))
    po.close()
    po.join()
    print(f"({os.getpid()}) End")

总结

创建进程方式:

  1. 直接创建Process对象,用target指定函数,这个函数就是新的进程执行的代码
  2. 自定义一个类,继承Process,一定要重写run
  3. 进程池,Pool(3)

区别:1和2默认主进程等待子进程,而3主进程结束后会杀死子进程,使用json等待子进程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果手机怎么删除软件?彻底删除顽固app的3个方法!

案例:苹果手机有流氓软件删不掉怎么办? 【好烦,在网页上误点下载了一些流氓软件,怎么都删不掉,我该怎么办?求大神支招!】 在苹果手机上删除软件通常是一个简单的过程,但有时候可能会…

【Java 基础】反射

反射是框架的灵魂。动态代理、很多框架(SoringIOC、AOP等)中都用到了反射。 概述: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(包括私有的);对…

一款高效的企业级表格可视化搭建解决方案DripTable

DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案,项目基于 React 和 JSON Schema,旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目:drip-table、drip-table-gene…

SpringBoot实战(四)获取接口请求中的参数(@PathVariable,@RequestParam,@RequestBody)

一:获取参数 SpringBoot提供的获取参数注解包括:PathVariable,RequestParam,RequestBody,三者的区别如下表: 二、java基础(spring注解PathVariable和RequsetParam的区别还有RequestBody) Path…

“AI孙燕姿”们侵了谁的权?

“2003年大火的歌手:孙燕姿;2023年大火的歌手:AI孙燕姿”。在B站,这条评论获赞2800多,而被网友们集体点赞的是用AI克隆孙燕姿声音后演唱其他歌曲的视频。 截止目前,Up主们打造的“AI孙燕姿”已翻唱了百余首…

每日学术速递5.14

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.An Inverse Scaling Law for CLIP Training 标题:CLIP 训练的逆比例定律 作者:Xianhang Li, Zeyu Wang, Cihang Xie 文章链接:https://arxiv.…

【Linux】Linux编辑器-gcc/g++使用

目录 一、背景知识 二、gcc是如何完成的 1、预处理(进行宏替换) 2、编译(生成汇编) 3、汇编(生成机器可识别代码) 4、链接(生成可执行文件或库文件) 4.1、静态库 4.2、动态库 4.3、动静态库的比较 三、gcc常见的选项 一、背景知识 计算机是二进制读取文件的,我们…

HHDBCS及HHDESK的资源加密功能

安全性,是头等重要的事情。HHDBCS及HHDESK均有一项实用功能,资源加密。 HHDBCS 打开HHDBCS,出现连接管理界面(或者在运行过程中,点击连接管理),点击如下图箭头所指处的图标即可 HHDESK 点击主…

全球范围内的数字化时代,挑战和价值有哪些?

近年来,数字经济的发展趋势越来越明显,尤其是随着疫情的影响,加速了传统产业向数字化、网络化和智能化产业的转型和升级。全球数字经济规模不断扩大,体量连年增长,根据中国信息通信研究院报告显示,2019年全…

VMware虚拟机,匹配库中的文件系统文件夹层次结构

不需要把虚拟机文件复制到本地就不需要勾选“匹配库中的文件系统文件夹层次结构”这个选项。 但是,即便是勾选“匹配库中的文件系统文件夹层次结构”这一选项,也可以不勾选下一个选项卡的任何选项。

Midjourney AI 官方中文版已开启内测申请;OpenAI 正准备向公众发布一款新的开源语言模型。

🚀 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 可调用 MJ 和 Niji 的最新模型和所有参数&…

Python源码怎么运行?

要运行Python源码,您需要安装Python解释器。Python解释器是一种软件,它可以读取Python源代码并将其转换为计算机可以理解和执行的指令。 在Windows操作系统上运行Python源代码的步骤: 在您的计算机上下载并安装Python解释器。您可以从Pyth…

COM接口规则的存在是有原因的

可能有些人认为接口上的 COM 接口规则没有必要设计的那么严格,但我想说的是,这些规则的存在是有原因的。 假设你在你的产品代码中新增加了版本号为 N 的接口,由于这个接口是内部使用的,没有任何公开文档。所以你可以随意修改它&a…

Sentinel 热点参数限流

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如: 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制用户 ID 为参数,针对一段时间…

Prompt工程师指南[资料整合篇]:Prompt最新前沿论文整理合集、工具和库推荐、数据集整合、推荐阅读内容等,超全面资料

Prompt工程师指南[资料整合篇]:Prompt最新前沿论文整理合集、工具和库推荐、数据集整合、推荐阅读内容等,超全面资料 1.论文合集 The following are the latest papers (sorted by release date) on prompt engineering. We update this on a daily bas…

Ozeki VOIP SIP SDK 10.3.199 Crack

Ozeki VOIP SIP SDK 使用Ozeki VoIP SIP SDK,您有机会制作自己的VoIP产品,例如软电话,甚至您自己的PBX。 Ozeki VoIP SIP SDK介绍 Ozeki VoIP SIP SDK 是一个软件开发工具包,允许您使用 SIP 协议进行 VoIP 呼叫。它可以很容易地…

LNMP平台对接redis服务

LNMP见我2023-04-17 10:51:16 发布的企业网站架构部署与优化 LNMP https://blog.csdn.net/Richard_Sniper/article/details/130158518?spm1001.2014.3001.5501 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 官网:http://redis.io/ 下载包&am…

解读直接RF采样架构及优势

多年来,数字收发机被应用在多种类型的应用中,包括地面蜂窝网络、卫星通信和基于雷达的监视、地球观测和监控。过去,收发机的系统工程师在这些应用中使用中频架构。现在,高速数据转换器的最新发展,使新型基于射频直接采…

gif怎么转换成mp4格式?

gif怎么转换成mp4格式?GIF动态图片是一种常见的图片文件,平时我们聊天时会使用到表情包、广告宣传场景也会使用到gif动图,而MP4则是目前广泛应用的视频格式,相信大家都知道这一点。将GIF图片转换为视频格式是一种非常实用的方法。…

SpringCloud实用篇02

文章目录 SpringCloud实用篇020.学习目标1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1)添加一个环境共享配置2)在user-service中读取共享配置3&#xff09…