python 多进程 多线程 程序

这个纯粹为了增加理解,将很多比较好的资料进行归纳总结。

1、理论汇总

  • 并发和并行

     

    image.png

  • 多进程和多线程

  • 同步和异步
    同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。

    异步:异步的概念和同步相对,当一个异步功能调用发出后,调用者不能立即
    得到结果。
    简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
    同步和异步的区别:请求发出后,是否需要等待结果,才能继续执行其他操作。
    假设说有个函数func(param),里面会有若干个模块,最后返回一个结果,同步就是说等这个函数调用结束返回值之后才会往下继续。意思就是说,这个调用里,这几个模块会紧挨着顺序进行。
    而在异步中,这几个模块可能不是紧挨着的。
    举个例子如下

  • 什么是进程挂起
    参加下面阻塞时候的情况。
  • 什么是阻塞和非阻塞

阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  • 关于异步、同步、阻塞和非阻塞的区别
    同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态。

以小明下载文件打个比方,从这两个关注点来再次说明这两组概念,希望能够更好的促进大家的理解。

同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。

同步体现在:等待下载完成通知;

阻塞体现在:等待下载完成通知过程中,不能做其他任务处理;

同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。

同步体现在:等待下载完成通知,但是要在;

非阻塞体现在:等待下载完成通知过程中,去干别的任务了,只是时不时会瞄一眼进度条;【小明必须要在两个任务间切换,关注下载进度】

异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。

异步体现在:下载完成“叮”一声通知;

阻塞体现在:等待下载完成“叮”一声通知过程中,不能做其他任务处理;

异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。

异步体现在:下载完成“叮”一声通知;

非阻塞体现在:等待下载完成“叮”一声通知过程中,去干别的任务了,只需要接收“叮”声通知即可;【软件处理下载任务,小明处理其他任务,不需关注进度,只需接收软件“叮”声通知,即可】

也就是说,同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务),在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。

所以,综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。也就是说,同步的情况下,是由处理消息者自己去等待消息是否被触发,而异步的情况下是由触发机制来通知处理消息者,所以在异步机制中,处理消息者和触发机制之间就需要一个连接的桥梁:

在小明的例子中,这个桥梁就是软件“叮”的声音。

同步/异步与阻塞/非阻塞#

1 同步阻塞形式

效率是最低的,

拿上面的例子来说,就是你专心等待下载完成,什么别的事都不做。

实际程序中:就是未对fd 设置O_NONBLOCK标志位的read/write 操作;

2 异步阻塞形式

异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。

3 同步非阻塞形式

实际上是效率低下的,

想象一下你一边干别的事情一边还需要抬头看下载完成没有,如果把干别的事情和观察下载完成情况的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。

4 异步非阻塞形式

效率更高,

因为等待下载完成是你(等待者)的事情,而通知你则是电脑(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

至此,关于进程线程、同步异步、阻塞非阻塞、并发并行已经讲的差不多了,有讲的不好的地方请大佬指出。同时也谢谢网上大佬的文章帮助我理解了这些概念。

  • 进程间的通信

  • 进程共享内存
    主要参加下面2.2 的例子

2、常用用法总结

2.1 最常用程序

在python中最常用的是用multiprocessing这个模块来实现多进程。

#coding: utf-8
import multiprocessing
import timedef func(msg):print "msg:", msgtime.sleep(3)print "end"if __name__ == "__main__":pool = multiprocessing.Pool(processes = 3)for i in xrange(4):msg = "hello %d" %(i)pool.apply_async(func, (msg, ))   #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~"pool.close()pool.join()   #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print "Sub-process(es) done."

result.png

  • pool.apply_async(func, (msg, )) 是 指异步加载 (看上面解释)
    针对结果,是说,每个进程在调用func 这个函数的时候,不需要等待一个进程调用结束,返回结果之后,再有新的进程调用,而是说,每个都可以进行调用,不用等到正在调用这个函数的进程调用结束再调用(有点绕)。通俗来说就是,msg:hello 1 和end 在输出中并不是紧挨着的。

  • pool.close() 是说不再加入新的进程
    记住就好

  • pool.join() s是说等运行的所有进程结束之后才会运行后面的主程序。
    这个体现在所有的子进程结束之后,才会输出“Sub-process(es) done”

2.2. demon

2.3 主进程和子进程共享内存

import multiprocessing 
from multiprocessing import Manager
# 查看电脑的核数
print(str(multiprocessing.cpu_count()))def func(i,l):temp = [i,i+1]l.append(temp)print('%s series'%i)if __name__ =='__main__':df = pd.DataFrame()manager = Manager()pool = multiprocessing.Pool(processes =4)l= manager.list([])for x in range(100):
#        pool.apply_async(func,(x,))pool.apply_async(func,(x,l))
#        df = df.append(temp)pool.close()pool.join()print(l)print('done')

result.png


首先设置一个manager = Manager()
在主进程中先设置一个l 作为list, l= manager.list([])
然后将l 传入每个子进程中pool.apply_async(func,(x,l))
然后在每个子进程中分别对l append
最后在主进程中l 就是所有的apend 加总。

2.4 进程池阻塞和非阻塞的代码

2.4.1. 阻塞

#coding: utf-8
import multiprocessing
import timedef func(msg):print "msg:", msgtime.sleep(3)print "end"if __name__ == "__main__":pool = multiprocessing.Pool(processes = 3)for i in xrange(4):msg = "hello %d" %(i)pool.apply(func, (msg, ))   #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~"pool.close()pool.join()   #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print "Sub-process(es) done."

image.png

2.4.2 非阻塞

import multiprocessing
import timedef func(msg):print "msg:", msgtime.sleep(3)print "end"return "done" + msgif __name__ == "__main__":pool = multiprocessing.Pool(processes=4)result = []for i in xrange(3):msg = "hello %d" %(i)result.append(pool.apply_async(func, (msg, )))pool.close()pool.join()for res in result:print ":::", res.get()print "Sub-process(es) done."

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言刷题日记(附详解)(2)

一、有理数加法 输入格式: 输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。 输出格式: 在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若…

​14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

Linux系统下的容器安全:深入解析与最佳实践

在云计算和微服务架构的推动下,容器技术因其高效、可移植和灵活的特点,已经成为现代软件开发和部署的首选方案。然而,容器的广泛应用也带来了新的安全挑战,尤其是在Linux系统下,容器安全的实现和维护变得尤为重要。本文…

如何使用python脚本爬取微信公众号文章?

1、什么是爬虫? 在座的各位可能经常听到一个词,叫“爬虫”,这是一种能够悄无声息地将网站数据下载至本地设备的程序。利用爬虫,您无需亲自访问特定网站,逐个点击并手动下载所需数据。相反,爬虫能够全自动地…

STM32——PWM波形输出

一、IC和OC 可以看到:定时器除了基本的定时中断功能,输入捕获、输出比较均是STM32定时器的功能 输入捕获IC(Input Capture) 输入捕获是一种用于测量外部信号脉冲宽度或频率的技术。它通过定时器模块捕获外部信号的特定事件&…

2024年AI编程新手必备工具,快速提升技能!

在当今这个技术日新月异的时代,AI编程已成为一个越来越重要的领域,吸引着众多新手和希望提升自己的中级开发者进入。 对于这些渴望在AI领域快速成长的人来说,选择合适的编程工具是至关重要的。 接下来,我们将深入探讨几款市场上…

Aria2安装和使用-Mac版

起因是需要网盘下载,无奈限速很烦,查找很多方案后,最终决定使用Aria2 Tampermonkey。 其中Aria2是一款开源轻量的下载软件,简单来说就是可以通过URL直接下载。 Tampermonkey则是一款插件,我这里是.crx结尾的谷歌插件…

抢单源码修正版,带教程,自动抓取订单,十几种语言可自动切换

亚马逊抢单源码自动抓取订单任务邀请英文,西班牙语可自动切换语言亲测修正版。带完整开源的前后台。 西班牙,英文,巴西,中文,德国,拉法兰西,荷兰,缅甸,Sverige,日本,Trk…

专利权和版权有什么区别?

专利权和版权有什么区别?

SD差点挂掉,后备军们兴奋入场,AI生图应用正在爆发?

前后不到一个月,两个开源生图模型相继上线。 首先是由称得上 SD 原班人马的黑森林实验室推出的 FLUX.1。黑森林实验室由 Stable Diffusion 的核心开发者 Robin Rombach 领衔创立,团队成员基本上都是 Stable Diffusion 3 的作者,其中三名元老…

内存管理篇-04伙伴系统

本小节有几个重要的知识点: 伙伴系统的思想伙伴系统的实现伙伴系统分配器:内存块的申请、释放过程伙伴算法和阶数 1.伙伴系统的思想 针对某个某个zone分区,(1)把物理地址相连的空闲页连接起来合成一个物理块&#xf…

数据结构——冒泡、选择、插入和希尔排序

目录 引言 冒泡排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 选择排序 1.算法思想 2.算法步骤 3.代码实现 (1)优化前 (2)优化后 4.复杂度分析 插入排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 希尔排序 1.算法思想 2.算法步骤 3.代码实…

tcp 网络通信及抓包工具的使用

tcp网络通信 本地回环(Loopback)的概念 本地回环地址是一个特殊的IP地址,用于指向计算机本身的网络接口。在IPv4中,最常见的本地回环地址是127.0.0.1,而在IPv6中则是::1。这个地址用于测试网络软件,确保网…

量化交易backtrader实践(四)_评价统计篇(1)_内置评价

背景 通过对基础的学习和不断深入的实践,当我们已经能够制作出快速获取数据,以及制作出多个股票 乘上多种策略进行回测的部分的时候,我们就会明显发现数据有点多了,比如10支股票都用了3种策略就得到30段数据,一页显示…

亲测好用,ChatGPT 3.5/4.0新手使用手册,最全论文指令手册~ 【2024年 更新】

本以为遥遥领先的GPT早就普及了,但小伙伴寻找使用的热度一直高居不下,其实现在很简单了! 国产大模型快200家了,还有很多成熟的国内AI产品,跟官网一样使用,还更加好用~ ① 3.5 大多数场景是够用的&#xff…

Mix|使用VS2017CMake构建Qt工程 仿照MVS(仅用于学习)

MVS下载链接:https://www.hikrobotics.com/cn/machinevision/service/download/?module0 CMake工程构建参考:CMake|VS2017CMake3.8搭建Qt项目 文章目录 效果图整体结构实现代码最外层CMakeLists.txt代码实现及CMakeLists.txt搭建CMakeLists.txt搭建主函…

[创业之路-141] :产品经理 - NPDP概述

目录 一、产品经理以及主要职责 1.1 概述 1、市场调研与需求分析 2、产品规划与设计 3、项目管理与协调 4、产品推广与销售支持 5、产品运营与维护 6、其他职责 1.2 产品经理与项目经理的职责分工 1.2.1 职责区别 产品经理 项目经理 1.2.2 合作方式 二、什么是NP…

EXCEL——Vlookup17个高级用法

大纲 一、基本语法 1、参数详解 二、入门篇 1、单条件查找 2、屏蔽查找返回的错误值 三、进阶篇 1、反向查找 2、包含查找 3、区间查找 4、含通配符查找 5、多列查找 6、多区域查找 四、高级篇 1、多条件查找 2、合并单元格查找 3、带合并单元格的多条件查找 …

[数据集][目标检测]夜间老鼠检测数据集VOC+YOLO格式316张1类别+视频文件1个

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):316 标注数量(xml文件个数):316 标注数量(txt文件个数):316 标注类别…

MATLAB进阶:矩阵代数

今天我们学习矩阵在MATLAB中的运算。 运算符 与数组运算相同: A. ’转罝 A’(共轭)转罝 共轭转置(A’或A†): 对于一个复数矩阵A,其共轭转置记作A’或A†。共轭转置不仅将矩阵A的行和列互…