Python:多进程multiprocessing,多进程和多线程的应用

python多线程多进程介绍及多进程详解(调用multiprocessing组件) 这里我们解决以下几个问题:多进程多线程概念 多进程单进程区别 python下通过multiprocessing调用多进程的基本方法 阅读详情

目录

多进程

multiprocessing

Process类

进程间同步

进程池举例

多进程、多线程的线程

多线程、多进程应用


多进程

由于Python的GIL,多线程未必是CPU密集型程序的好的选择
多进程可以完全独立的进程环境中运行程序,可以充分地利用多处理器
但是进程本身的隔离代理的数据不共享也是一个问题,而且线程比进程轻量级

multiprocessing

Process类

Process类遵循了Thread类的API,减少了学习难度;
先看一个例子,前面介绍的单线程、多线程比较的例子的多进程版本

import multiprocessing
import datetime

def cacl(i):
    sum = 0
    for _ in range(100000000):
        sum +=1
    print(i,sum)

if __name__ == '__main__':
    start = datetime.datetime.now()

    ps = []
    for i in range(5):
        p = multiprocessing.Process(target=cacl,args=(i,),name="cacl-{}".format(i))
        ps.append(p)
        p.start()
    for p in ps:
        p.join()
    delta = (datetime.datetime.now()-start).total_seconds()
    print(delta)

结果:
2 100000000
1 100000000
4 100000000
3 100000000
0 100000000
5.942173

单线程、多线程都跑了4分钟多,而多进程用了1分半,这是真并行

名称        说明
pid  进程id
exitcode  进程退出状态码,0代表退出,非0代表有问题
terminate()终止指定的进程

进程间同步

进程间同步提供了和线程一样的类,使用的方法一样,使用的效果也类似
不过,进程间代价要高于线程间,而且底层实现是不同的,只不过Python屏蔽了这些不同之处,让用户简单使用多进程

multiprocessing还提供共享内容,服务器进程来共享数据,还提供了Queue队列、Pipe管道用户进程间通信。

通信方式不同:

  • 多进程就是启动多个解释器进程,进程间通信必须序列化、反序列化
  • 数据的线程安全性问题:由于每个进程中没有实现多线程,GIL可以说没什么用了

进程池举例

multiprocessing.Pool是进程池类。
 

名称说明
apply(self,func,args=(),kwds={} )阻塞执行,导致主进程执行其他子进程就像一个个执行
apply_async(self,func,args=(),kwds={},callback=None,error_callback=None)与apply方法用法一致,非阻塞执行,得到结果后执行回调
close()关闭池,池不能接受新的任务
terminate()结束工作线程,不在处理未处理的任务
join()        在close或terminate之后使用

import logging
import datetime
import multiprocessing

#日志打印进程ID、进程名、线程id、线程名
logging.basicConfig(level=logging.INFO,format='%(process)d %(processName)s %(thread)d %(message)s')

#计算
def calc(i):
    sum = 0
    for _ in  range(100000000):
        sum +=1
    logging.info("{} .in funcating".format(sum))
    return sum #进程要return,callback可以拿到这个效果

if __name__ == '__main__':
    start=datetime.datetime.now()
    pool = multiprocessing.Pool(5)

    for i in range(5):
        #回调函数必须接受一个参数
        pool.apply_async(calc,args=(i,),callback=lambda x:logging.info("{}.incallback".format(x))) #异步执行
    pool.close()
    pool.join()
    delta=(datetime.datetime.now()-start).total_seconds()
    print(delta)
    print("主进程结束")

结果:
23900 SpawnPoolWorker-1 2800 100000000 .in funcating
16320 MainProcess 24952 100000000.incallback
19572 SpawnPoolWorker-5 17160 100000000 .in funcating
16320 MainProcess 24952 100000000.incallback
7272 SpawnPoolWorker-3 19112 100000000 .in funcating
16320 MainProcess 24952 100000000.incallback
3104 SpawnPoolWorker-4 7044 100000000 .in funcating
16320 MainProcess 24952 100000000.incallback
12684 SpawnPoolWorker-2 24104 100000000 .in funcating
16320 MainProcess 24952 100000000.incallback
6.163994
主进程结束

多进程、多线程的线程

1、CPU密集型
CPython中使用到了GIL,多线程的时候相互竞争 ,且多核优势不能发挥,Python多进程效率更高

2、IO密集型
适合适用多线程,可以减少多进程间IO的序列化开销。且在IO等待的时候,切换到其他线程继续执行,效率不错

多线程、多进程应用

请求/应答模型:WEB应用总常见的处理模型

master启动多个woker工作进程,一般和CPU数目相同,发挥多核优势
worker工作进程中,往往需要操作网络IO和磁盘IO,启动多线程,提高并发处理能力。worker处理用户的请求,往往需要的等待数据,处理完请求还要通过网络IO返回响应,这就是nginx工作模式

Python并发之多进程multiprocessing(2) 1, 多进程 vs 多线程 Python中的常见的并发模型分为两种: 多线程threading并发,多用于IO密集型计算 多进程multiprocessing并发,多用于CPU密集型计算 (1)IO密集 vsCPU密集 IO密集: I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时... 阅读详情

相关推荐

AIGC在游戏行业的应用:革新游戏开发与体验

AIGC(人工智能生成内容)技术正在深刻改变游戏行业,从开发到体验全面革新。在游戏开发中,AIGC可用于自动生成关卡、角色剧情,提升开发效率;在资源制作中,通过AI生成场景、角色模型等,降低成本。

1589

Python使用multiprocessing.Pool实现固定数量线程池

目录1. Python使用multiprocessing.Pool实现固定数量线程池 1. Python使用multiprocessing.Pool实现固定数量线程池 from multiprocessing import Pool, cpu_count import time import os def thread_task(number): print("线程id为: %d, 处理的任务为:%d, 线程处理【开始】" % (os.getpid(), number)) time.s

Bulut0907 5022

python多进程multiprocessingfork

最近使用python进行多进程开发,遇到问题:multiprocessing.Process的实例化必须放在if __name__ == "__main__"代码块或自定义函数中,这个问题涉及到以下知识点: __main__的作用、multiprocessing在windows下实现多进程的过程、unix下fork的原理,下面逐一解答。 先科普下进程的定义:程序的一次动态执行过程,包括代...

qm5132的博客 8077

Pythonmultiprocessing 模块:多进程并行计算

Pythonmultiprocessing模块用于多进程并行计算,可以充分利用多核CPU进行任务加速,突破PythonGIL(全局解释器锁)的限制,提高程序执行效率。multiprocessing.Process创建进程以实现并行计算。Pool.map()批量处理任务,更高效。Queue、Manager进行进程间通信。Lock同步进程,防止竞争。适用于CPU密集型任务,如科学计算、数据处理、机器学习等。

彬彬侠的博客 2564

day 7-2 multiprocessing开启多进程

一. multiprocessing模块介绍    python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进程Python提供了multiprocessingmultiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的...

weixin_30535565的博客 150

Python浅聊进程(multiprocessing线程(threading)

简单介绍了python中进程与线程的基础概念,以及互斥锁、进程池调用等简单用法

weixin_40013461的博客 1940

Python3多进程(mutiprocessing)

Threading的比较 多进程 Multiprocessing 多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 Python 还要出一个 multiprocessing 呢? 原因很简单, 就是用来弥补 threading 的一些劣势, 比如在 threading 教程中提到的GIL. 使用 multiproc...

Melo 2万+

python 多线程读写文件_python 关于多进程多线程且写入同一文件情况

目录[-]python 关于多进程多线程且写入同一文件情况任何语言学习多进程多线程这都市必要的,最近在学习过程中涉及诸多多进程多线程的情况,但是多进程之间文件是相互独立的,容易发生资源争抢的问题,造成资源的抢夺,同时写入文件使之卡住,由于不规律随机的原因,写入文件的数据也可能是乱码多进程写入文件关于网上所整理的一些资料来看,处理的方式各不相同1.使用进程锁,multiprocessing使用...

weixin_39703551的博客 1068

Python Multiprocessing多进程

Python Multiprocessing多进程

sikh_0529的博客 3万+

Python 多进程解析:Multiprocessing 高效并行处理的奥秘

Python 编程中,多进程Multiprocessing)是一种提高程序执行效率的重要手段。本文深入解析了多进程的概念与应用,帮助开发者充分利用多核处理器的计算能力。我们从基本的进程创建与启动开始,讲解了如何通过 `Queue` 实现进程间的数据传递,并通过对比多进程多线程的性能差异,揭示了多进程在处理 CPU 密集型任务时的显著优势。文章还详细介绍了进程池(Pool)的使用方法,包括 `map` `apply_async` 的不同应用场景。

敲代码别忘了喝上一杯凉白开。 4199

Python多进程(process)多线程(thread)的区别

一、线程与进程 1.基本概念 线程:是程序执行流的最小单元,是系统独立调度分配CPU(独立运行)的基本单位。 进程:是资源分配的基本单位。一个进程包括多个线程。 一个应用程序至少包括1个进程,而1个进程包括1个或多个线程,线程的尺度更小。 每个进程在执行过程中拥有独立的内存单元,而一个线程的多个线程在执行过程中共享内存。 2.区别 (1)线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。 (2)每个进程都有自己一套独立的资源(数据),供其内的所有线程共享。

rs勿忘初心的博客 1万+

Python多进程多线程详解

1.进程的概念 一个CPU的时候运行,轮询调度实现并发执行 多CPU运行机制: 计算机程序:存储在磁盘上的可执行二进制(或其他类型)文件。 只有把它们加载到内存中,并被操作系统调用它们才会拥有其自己的生命周期。 进程:表示的一个正在执行的程序。 每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据 操作系统负责其上所有进程的执行,操作系统会为这些进程合理地分配执行时间。 多...

小猪的互联网江湖 2万+

Python进阶(十)多进程multiprocessingsubprocess模块

文章目录subprocess模块subprocess.run() 函数的使用subprocess.Popen()函数实时获取subprocess子进程的输出多进程multiprocessing为什么要多进程多进程实现方法   进程是资源分配的最小单位,线程是CPU调度的最小单位。做个简单的比喻:进程=火车,线程=车厢。 subprocess模块   Python的subprocess模块,用来创建管理子进程(不是线程),并能够与创建的子进程的stdin,stdout,stderr连接通信,获取子进程执行

小小何先生的学习之旅 1万+

Python使用multiprocessing实现多进程

大家好,当我们工作中涉及到处理大量数据、并行计算或并发任务时,Pythonmultiprocessing模块是一个强大而实用的工具。通过它,我们可以轻松地利用多核处理器的优势,将任务分配给多个进程并同时执行,从而提高程序的性能效率。在本文中,我们将探索如何使用multiprocessing模块实现多进程编程。将介绍进程池的概念用法,以及如何使用它来管理调度多个进程。我们还将讨论并发任务的处理、进程间通信结果获取等关键问题,希望能给大家的工作带来一些帮助。

若不知道要驶向哪个码头,那么任何风都不会是顺风。 9634

并发并行 | Python中实现多线程 threading 多进程 multiprocessing

深入浅出比喻说明线程与进程,附小白都能看懂的对比试验。

记录学习痕迹的公众号:Piper蛋窝 6742

pythonmultiprocessing多进程线程问题以及join()等

可能需要参考:并行、串行、并发 参考:线程创建知识: 总结:python中,一个进程创建后会自动建立一个主线程,在建立其他子线程后,会出现主线程结束后,一、(设置set.Daemon(True))子线程结束 ;二、(默认set.Daemon(false))时间结束(子线程仍执行的情况)三、使用join()中的参数有一个timeout,可以设置结束时间,也可以默认子线程执行结束完成。这时主线程需要等待到对应条件满足后才结束。 multiprocessing的模块使用显示问题 一个简单进程的建立使用 impor

weixin_43794311的博客 6486

Python 多进程编程:multiprocessing 模块全面解析

模块是 Python 标准库的一部分,提供了创建管理进程的高级接口。与多线程不同,每个进程都有自己独立的 Python 解释器内存空间,因此不受 GIL 的限制,可以真正实现并行计算。该模块支持跨平台使用,在 Windows、Linux macOS 等操作系统上都能正常工作。模块为 Python 开发者提供了强大的多进程编程能力。通过创建管理进程、使用进程间通信机制同步机制以及利用进程池,我们可以实现并行执行任务,充分发挥多核 CPU 的计算能力。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 2251

多线程(Threading)多进程(Multiprocessing)

Python多线程高并发什么是多线程基本方法函数继承使用线程同步 什么是多线程 单线程: 在程序当中,只有一个箭头指向代码从头到尾执行。 import time def sorry(): print("Sorry") time.sleep(1) if __name__ == '__main__': for i in range(5): sorry() 依次打印五个sorry,每个间隔1秒 多线程: 在一个脚本当中,一次同时运行多个程序。 import time i

Hanhahahahah的博客 3998

Python多线程 threading 多进程 multiprocessing

Python多线程 threading 多进程 multiprocessing

ZhengrongYue的博客 1887

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 129

扣子Coze实战:情感早安电台全自动制作[可运行源码]

本文详细介绍了如何利用扣子(Coze)工作流实现情感早安电台的全自动制作流程。作者咕咕姐分享了从文案生成、配音合成到视频剪辑的完整步骤,通过扣子平台的大模型节点第三方插件,用户只需输入一个主题即可自动生成治愈文案、配音、字幕、背景音乐及视频素材,最终输出可直接用于发布的剪映草稿。文章分三部分展开:第一部分详细拆解了28个节点的搭建流程,包括文案生成、时间处理、音频合成、视频剪辑等核心环节;第二部分提供了测试运行的具体方法;第三部分总结了全流程并提供了获取完整提示词的途径。该方法显著降低了内容创作门槛,使零基础用户也能高效产出高质量情感内容。

上一篇: Python:信号量semaphore
下一篇: Python:concurrent异步并行任务编程模块、 线程池、进程池、上下文管理
Amae
博客等级 码龄7年 553粉丝 126原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值