目录

1 python多进程编程概述

2 需求和方案

背景:

需求:

解决思路:

需要解决的问题和方案:

3 完整代码


1 python多进程编程概述

  • python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了multiprocessing。
  • multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。
  • 与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。

2 需求和方案

背景:

在服务器某文件夹路径内,会接收软件端发来的数据包(如果接收还不完整,该文件夹名称会以‘-downloading’为后缀),数据包是文件夹格式,里面有个和文件夹名称同名的ZIP包。

算法需要对发来的数据包进行解压缩,然后处理压缩包内的数据,待数据处理完后,这个文件夹及其内容会移动到另外一个地方归档。

需求:

服务器需要支持多并发。

解决思路:

考虑到python多线程鸡肋,采用多进程实现。

需要解决的问题和方案:

  1. 如何避免同一个数据包被多个进程解析?

    1. 方案:使用队列来构建生产者(主进程)消费者(子进程)模式。所有新生成的数据包,其文件夹名称统一放入一个共享队列中,所有进程从该队列中取数据包名称,该队列自带‘锁’的功能。
  2. 主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程?
    1. 方案:构建‘进程组’形式 + 向进程组发送SIGKILL信号
    2. 参考:
      1. https://blog.csdn.net/lucia555/article/details/105957928/
      2. https://www.cnblogs.com/domestique/p/8241219.html

3 完整代码

from multiprocessing import Process, Queue
import os
import time
import signalimport zipfile
import shutildef unzip_file(sample_key_pair):try:zip_name = sample_key_pair + '.zip'sampleraw_zip = os.path.join('./zip/'+ sample_key_pair, zip_name)with zipfile.ZipFile(sampleraw_zip) as z:z.extractall(path='./zip/'+ sample_key_pair, members=None, pwd=None)except Exception as e:print('Fail to unzip file: {}', e)def mv_dir(sample_key_pair):shutil.move('./zip/'+ sample_key_pair, './mv_zip')def gan_huo_de_jin_cheng(zip_Queue):print('子进程 pid 是 %s, group id is %s' % (os.getpid(), os.getppid()))while True:if not zip_Queue.empty():# 1 抽取一个压缩包sample_key_pair = zip_Queue.get()print('子进程:',os.getpid(),'获取压缩包',sample_key_pair)# 2 解压unzip_file(sample_key_pair)# 3 移动文件夹mv_dir(sample_key_pair)#一旦主进程被杀死,子进程也全部关闭。
def term(sig_num, addtion):print('term current pid is %s, group id is %s' % (os.getpid(), os.getppid()))os.killpg(os.getpgid(os.getpid()), signal.SIGKILL)if __name__== '__main__':  #在测试多进程编程时,需要加这个,不然调试报错。raw_data_root = './zip'signal.signal(signal.SIGTERM, term)print('主进程 pid 是 %s' % os.getpid())zip_Queue = Queue() #队列不指定大小,就无限大使用空间,队列使用内存的空间zip_list = [] #搞个zip_Queue同内容的复制品,因为Queue中内容无法遍历和查询。#创建子进程for i in range(3): t = Process(target=gan_huo_de_jin_cheng, args=(zip_Queue, ))t.daemon = Truet.start()#遍历到新的压缩包,就压入队列while True:time.sleep(1) #1秒检索一次文件夹sample_raw_list = os.listdir(raw_data_root)if len(sample_raw_list) != 0:# 1 检索文件夹内是否有 ‘完好’ 的压缩包,且压缩包名字和队列中名字不一致。for sample_raw_dir in sample_raw_list:sample_key_pair = sample_raw_dir.split('/')[-1]if(sample_key_pair.endswith("-downloading")): #如果数据包还没下载好,跳过continue# 如果队列中没有此zip包文件夹,就加入队列if sample_key_pair not in zip_list: zip_Queue.put(sample_key_pair)zip_list.append(sample_key_pair)if len(zip_list) > 100:zip_list.pop(0)#删除第1个。(当zip_list超过100个时,进一个就删一个,防止zip_list越来越大。)

主要参考:

  1. python并发编程之多进程(实践篇) - anne199534 - 博客园
  2. Python 3 并发编程多进程之队列(推荐使用) - 鱼皮弟 - 博客园
  3. python 并发编程 多进程 队列 - minger_lcm - 博客园
  4. python多进程编程,如何让主进程和子进程都退出_走走看看-CSDN博客_python主进程退出时子进程也退出
  5. 主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程 - shy车队破风手 - 博客园
  6. pytorch使用出现"RuntimeError: An attempt has been made to start a new process before the..." 解决方法 - 灰信网(软件开发博客聚合)
  7. put_nowait与get_nowait - 江湖乄夜雨 - 博客园
  8. Python|队列Queue - yangyidba - 博客园
  9. Python 队列(Queue)用法_大魔王的博客-CSDN博客_python queue

并发编程之多进程编程(python版)相关推荐

  1. 并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等 目录 1. “共享内存系统”,消息传递系统”。 1 1.1. 共享模式 多进程 多线程 1 1.2. Actor消息模式 事件驱动 2

    并发编程含义比较广泛,包含多线程编程.多进程编程及分布式程序等 目录 1. "共享内存系统",消息传递系统". 1 1.1. 共享模式 多进程 多线程 1 1.2. Ac ...

  2. 函数式编程实战教程(Python版)

    许多函数式文章讲述的是组合.流水线和高阶函数这样的抽象函数式技术.本文不同,它展示了人们每天编写的命令式.非函数式代码示例,以及将这些示例转换为函数式风格. 文章的第一部分将一些短小的数据转换循环重写 ...

  3. python多进程编程 多个函数并发执行_python并发编程之多进程编程

    一.multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  4. python函数编程实战_(转)函数式编程实战教程(Python版)

    许多函数式文章讲述的是组合,流水线和高阶函数这样的抽象函数式技术.本文不同,它展示了人们每天编写的命令式,非函数式代码示例,以及将这些示例转换为函数式风格. 文章的第一部分将一些短小的数据转换循环重写 ...

  5. (转)函数式编程实战教程(Python版)

    许多函数式文章讲述的是组合,流水线和高阶函数这样的抽象函数式技术.本文不同,它展示了人们每天编写的命令式,非函数式代码示例,以及将这些示例转换为函数式风格. 文章的第一部分将一些短小的数据转换循环重写 ...

  6. Python并发编程之多进程(一)

    一.什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程是资源分配的基本单位 进程有:代码段,数据段,进程控制块(PCB)组成 二.进程与程序的区别 程序仅仅只是一堆代 ...

  7. python 多进程并发_python并发编程之多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  8. python并发编程之多进程、多线程、异步和协程

    转载 自 tyomcat: https://www.cnblogs.com/tyomcat/p/5486827.html 一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活 ...

  9. python编程图文_深入Python多进程编程基础——图文版

    多进程编程知识是Python程序员进阶高级的必备知识点,我们平时习惯了使用multiprocessing库来操纵多进程,但是并不知道它的具体实现原理.下面我对多进程的常用知识点都简单列了一遍,使用原生 ...

最新文章

  1. xml命名空间只是标记区分不同的空间的作用,一般与上网无关,虽然通常都写的是URL网址
  2. 【小样本学习】什么是小样本学习?这篇综述文章用166篇参考文献告诉你答案...
  3. 波士顿动力最新仓储机器人,每小时“搬砖”800块
  4. SQL Server 学习系列之五
  5. 无法访问http,会强制跳到https
  6. i27岁转行java,JavaTM I/O 性能分析[转]
  7. Linux下程序包管理工具RPM
  8. 科大星云诗社动态20201126
  9. 本周六与您相约 | 计算未来轻沙龙:让机器拥有理解语言的能力
  10. Java判断上传的文件是否是图片,如果是就对上传的图片进行压缩
  11. Python学习,装饰器,元类
  12. Big Sur bug汇总与解决:macOS Big Sur更新后你遇到了哪些问题?
  13. 查找字符在字符串出现的次数
  14. 模仿莫烦的PyCharm主题
  15. 怎么利用计算机辅助评标,计算机辅助评标系统及其的应用.doc
  16. 7款流程图制作软件大盘点!轻松绘制流程图
  17. 希尔伯特空间等各空间介绍-数据升维以及核函数选择
  18. 如何学好游戏编程 二
  19. John破解Linux哈希密码文件
  20. 详解BUG(又名:BUG的生命周期)

热门文章

  1. Android ViewAnimationUtils (动画) 的使用
  2. Androidx CoordinatorLayout 和 AppBarLayout 实现折叠效果(通俗的说是粘性头效果)
  3. git user name is not defined
  4. JMeter自学笔记3-创建自己的第一个测试用例
  5. [Python设计模式] 第21章 计划生育——单例模式
  6. linux mysql 2003错误代码,如何解决linux mysql2003错误
  7. Flameshot:Linux 环境下的一个简洁但功能丰富的截图工具
  8. eclipse调用JNI之环境的搭建
  9. Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法
  10. 《OpenCV3编程入门》学习笔记2 启程前的认知准备