python子进程关闭fd_如果创建了multiprocessing.Pool,Python子进程wait()将失败
在一个使用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()将失败相关推荐
- Python 进程池 multiprocessing.Pool - Python零基础入门教程
目录 一.Python 进程池 multiprocessing.Pool 介绍 二.Python 进程池 multiprocessing.Pool 使用 三.猜你喜欢 零基础 Python 学习路线推 ...
- python 绘图类_关于创建自定义绘图对象-python中的类,有很好的教程吗? - python...
我想创建一个用于自定义绘图的对象类.我正在寻找有关如何创建自己的绘图对象的面向对象入门的好教程((可能仍在使用像matplotlib这样的库)? 例如. class myplot: def __ini ...
- python的ide环境中创建文件_使用Python开发环境Wing IDE设立项目注意事项
使用Wing IDE的第一步是建立一个项目文件,这样Wing IDE就可以找到并分析源代码,存储工作. Wing IDE会自动以默认的项目进行启动.在本教程中用户也可以使用这个默认项目进行示例操作.如 ...
- c语言转python工具_c转python_c 转python_c语言转python - 云+社区 - 腾讯云
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 推荐使用腾讯云 api 配套的7种常见的编程语言 sdk,已经封装了签名和请求过 ...
- python如何关闭multiprocess_python 开启进程两种方法 multiprocessing模块 介绍
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进 ...
- python 多进程multiprocessing 如何获取子进程的返回值?进程池pool,apply_async(),get(),
案例1 # -*- coding: utf-8 -*- """ @File : 20200318_摄像头多进程流传输.py @Time : 2020/3/18 14:58 ...
- 用python中django创建网页终端直接关闭是什么问题_如何用Python Django创建网站?系列文章03(持续更新...)...
第三篇文章主要介绍的是如何将Django网站部署到阿里云服务器上,具体的流程如下图所示: 我们会按照这张思维导图的顺序逐个展开讲解: Section I, Ubuntu (1)我们需要在阿里云上租一台 ...
- python 多进程 调用模块内函数_Python进程池multiprocessing.Pool的用法
一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...
- python进程池:multiprocessing.pool
阅读目录 例1:使用进程池 例2:使用进程池(阻塞) 例3:使用进程池,并关注结果 例4:使用多个进程池 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操 ...
最新文章
- angularJS中directive与controller之间的通信
- PHP tcp短链接,http请求怎样实现TCP长连接、短连接
- JavaScript中的JSON
- ITK:从图像中提取轮廓
- Software-Defined Networking (SDN) Definition-软件定义网络
- 打开eclipse报错 Version 1.7.0_80 of JVM is not suitable for this product
- [转载] 七龙珠第一部——第029话 冒险再度开始
- Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的
- C4d的oc渲染器报错 There is no CUDA device which is selectedThere is no CUDA devic
- dtu MySQL_DTU-DATACENTER
- 082-我最爱的周杰伦九张专辑
- [Leetcode] 717. 1比特与2比特字符
- Applese涂颜色-欧拉降幂公式
- NDK中LOCAL_SHARED_LIBRARIES
- 遥感数据集的下载记录——MODIS产品为主
- vue中enter回车键事件
- Name or service not known, ping域名报错
- 7大爱好来提高编程技能
- leetcode 876.链表中间结点
- 协程一(协程优缺和解决实际问题)