在一个使用subprocess到gzip输出的简单脚本中(使用subprocess.PIPE到外部命令的stdin),如果在创建子进程和关闭进程的stdin之间创建了multiprocessing.Pool对象,则subprocess.wait ()将永远挂起.

import multiprocessing

import subprocess

proc = subprocess.Popen(["gzip", "-c", "-"],

stdout=open('filename', 'w'), stdin=subprocess.PIPE)

multiprocessing.Pool()

proc.stdin.close()

proc.wait()

移动multiprocessing.Pool调用一行或一行调用可以防止出现问题.

我在Python 2.7.3(Linux)和Python 2.7.1(OS X)上遇到过这种情况.

显然,这是一个微不足道的例子 – 真正的用法要复杂得多.我也已经知道GzipFile了 – 我宁愿不使用它;使用子进程可以通过将gzipping分成单独的线程来获得更多的CPU使用率.

我看不出简单地实例化Pool应该如何产生这种影响.

最佳答案 当您调用multiprocessing.Pool时,多处理模块会创建几个新进程(使用os.fork或类似的进程).

默认情况下,在fork期间,新进程会继承所有打开的文件描述符.

当您使用subprocess.PIPE参数调用subprocess.Popen时,子流程模块会创建一些新的管道文件描述符,以便向/从新进程发送数据.在这种特殊情况下,管道用于将数据从父进程(python)发送到子进程(gzip),并且gzip将退出 – 从而使proc.wait()完成 – 当对管道的所有写访问权限进行时远. (这是在管道上生成“EOF”的原因:该管道不再存在可写入的文件描述符.)

因此,在这种情况下,如果您(所有在“原始”python进程中)按此顺序执行此操作:

>创建一个管道

>创建一些multiprocessing.Pool流程

>将数据发送到gzip

>关闭管道以gzip

然后,由于fork的行为,每个Pool进程都有一个写入gzip管道的os.dup,因此gzip继续等待更多数据,这些池进程可以(但从不这样做)发送.一旦Pool进程关闭其管道描述符,gzip进程就会退出.

将其修复为真实(更复杂)的代码可能非常重要.理想情况下,您希望多处理.Pool(知道,不知何故)应该保留哪些文件描述符,哪些不应该保留,但这并不像“只是在创建的子进程中关闭一堆描述符”那么简单:

output = open('somefile', 'a')

def somefunc(arg):

... do some computation, etc ...

output.write(result)

pool = multiprocessing.Pool()

pool.map(somefunc, iterable)

显然,output.fileno()必须由工作进程共享.

您可以尝试使用Pool的初始化程序来调用proc.stdin.close(或在fd列表中的os.close),但是您需要安排跟踪描述符到关闭.重构代码可能最简单,以避免“在错误的时间”创建池.

python子进程关闭fd_如果创建了multiprocessing.Pool,Python子进程wait()将失败相关推荐

  1. Python 进程池 multiprocessing.Pool - Python零基础入门教程

    目录 一.Python 进程池 multiprocessing.Pool 介绍 二.Python 进程池 multiprocessing.Pool 使用 三.猜你喜欢 零基础 Python 学习路线推 ...

  2. python 绘图类_关于创建自定义绘图对象-python中的类,有很好的教程吗? - python...

    我想创建一个用于自定义绘图的对象类.我正在寻找有关如何创建自己的绘图对象的面向对象入门的好教程((可能仍在使用像matplotlib这样的库)? 例如. class myplot: def __ini ...

  3. python的ide环境中创建文件_使用Python开发环境Wing IDE设立项目注意事项

    使用Wing IDE的第一步是建立一个项目文件,这样Wing IDE就可以找到并分析源代码,存储工作. Wing IDE会自动以默认的项目进行启动.在本教程中用户也可以使用这个默认项目进行示例操作.如 ...

  4. c语言转python工具_c转python_c 转python_c语言转python - 云+社区 - 腾讯云

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 推荐使用腾讯云 api 配套的7种常见的编程语言 sdk,已经封装了签名和请求过 ...

  5. python如何关闭multiprocess_python 开启进程两种方法 multiprocessing模块 介绍

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

  6. python 多进程multiprocessing 如何获取子进程的返回值?进程池pool,apply_async(),get(),

    案例1 # -*- coding: utf-8 -*- """ @File : 20200318_摄像头多进程流传输.py @Time : 2020/3/18 14:58 ...

  7. 用python中django创建网页终端直接关闭是什么问题_如何用Python Django创建网站?系列文章03(持续更新...)...

    第三篇文章主要介绍的是如何将Django网站部署到阿里云服务器上,具体的流程如下图所示: 我们会按照这张思维导图的顺序逐个展开讲解: Section I, Ubuntu (1)我们需要在阿里云上租一台 ...

  8. python 多进程 调用模块内函数_Python进程池multiprocessing.Pool的用法

    一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...

  9. python进程池:multiprocessing.pool

    阅读目录 例1:使用进程池 例2:使用进程池(阻塞) 例3:使用进程池,并关注结果 例4:使用多个进程池 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操 ...

最新文章

  1. angularJS中directive与controller之间的通信
  2. PHP tcp短链接,http请求怎样实现TCP长连接、短连接
  3. JavaScript中的JSON
  4. ITK:从图像中提取轮廓
  5. Software-Defined Networking (SDN) Definition-软件定义网络
  6. 打开eclipse报错 Version 1.7.0_80 of JVM is not suitable for this product
  7. [转载] 七龙珠第一部——第029话 冒险再度开始
  8. Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的
  9. C4d的oc渲染器报错 There is no CUDA device which is selectedThere is no CUDA devic
  10. dtu MySQL_DTU-DATACENTER
  11. 082-我最爱的周杰伦九张专辑
  12. [Leetcode] 717. 1比特与2比特字符
  13. Applese涂颜色-欧拉降幂公式
  14. NDK中LOCAL_SHARED_LIBRARIES
  15. 遥感数据集的下载记录——MODIS产品为主
  16. vue中enter回车键事件
  17. Name or service not known, ping域名报错
  18. 7大爱好来提高编程技能
  19. leetcode 876.链表中间结点
  20. 协程一(协程优缺和解决实际问题)

热门文章

  1. hadoop hdfs访问权限更新延迟问题
  2. 群集lvs—DR的配置及应用
  3. Unity TIP3: 注入现有对象
  4. MongoDB中如何优雅地删除大量数据
  5. Spring IOC注入Map接口小技巧
  6. Ubuntu21.04下安装Jupyter notebook
  7. DEEPIN 20安装镜像进入LIVE模式
  8. linux ubuntu/deepin与Windows时间不同步解决办法(双系统)
  9. Java设计模式之享元flyweight模式代码示例
  10. Python爬虫开发:ip代理的使用