这里的简单答案是:不要使用subprocess.Popen,使用

multiprocessing.Process.或者,更好的是,multiprocessing.Pool或

concurrent.futures.ProcessPoolExecutor.

使用子进程,程序的Python解释器根本不了解子进程;据它所知,子进程正在运行Doom.所以没有办法直接与它共享信息.*但是通过多处理,Python控件启动子流程并设置所有内容,以便您可以尽可能方便地共享数据.

不幸的是,“尽可能方便”仍然不像在一个过程中那样方便100%.但你能做的通常是足够好的.阅读Exchanging objects between processes部分和以下几节;希望其中一个机制正是您所需要的.

但是,正如我在顶部隐含的那样,在大多数情况下,您可以通过使用池来使其更简单.不要考虑“运行6个进程并与它们共享数据”,而是将其视为“在6个进程池上运行一堆任务”.任务基本上只是一个函数 – 它接受参数,并返回一个值.如果您要并行化的工作适合该模型 – 听起来就像您的工作一样 – 生活就像生活一样简单.例如:

import multiprocessing

import os

import sys

import analysis

parent_dir = os.path.realpath(sys.argv[0])

paths = [os.path.join(folderpath, file)

for file in os.listdir(folderpath)]

with multiprocessing.Pool(processes=6) as pool:

results = pool.map(analysis.analyze, paths)

如果您使用的是Python 3.2或更早版本(包括2.7),则不能在with语句中使用Pool.我相信你想要这个:**

pool = multiprocessing.Pool(processes=6)

try:

results = pool.map(analysis.analyze, paths)

finally:

pool.close()

pool.join()

这将启动6个进程,***然后告诉第一个进行分析.分析(路径[0]),第二个做分析.分析(路径[1])等.一旦任何进程完成后,游泳池将为其提供下一个工作路径.当它们全部完成后,您将获得所有结果的列表.****

当然,这意味着生活在analysis.py中的顶级代码必须移动到函数def analyze(path)中:所以你可以调用它.或者,更好的是,如果您确实要保存该导入行,则可以将该函数移动到主脚本中,而不是单独的文件中.

*你仍然可以间接地共享信息,例如,将它编组成一些交换格式,如JSON,并通过stdin / stdout管道,文件,共享内存段,套接字等传递它,但是多处理有效地包含了这些信息.你要让它变得更容易.

**关闭池有不同的方法,你也可以选择是否立即加入它,所以你真的应该在某些时候阅读细节.但是当你所做的只是调用pool.map时,它确实没关系;保证游泳池关闭并准备好在地图呼叫返回时立即加入.

***我不确定你为什么要6;大多数机器有4个,8个或16个核心,而不是6个;为什么不全部使用它们?最好的做法通常是完全省略进程= 6并让多处理器向你的操作系统询问使用多少内核,这意味着它仍然可以在你的新机器上全速运行,内核数量是你的两倍.明年会买.

****这有点过于简单;通常,池会为第一个进程提供一批文件,而不是一次一个,以节省一些开销,如果需要优化或更仔细地对它们进行优化,则可以手动控制批处理.但通常你不在乎,这种过度简化是好的.

python子进程修改父进程内变量_如何将父变量传递给python中的子进程?相关推荐

  1. plsql 往视图传参数_我们可以将参数传递给SQL中的视图吗?

    20 个答案: 答案 0 :(得分:113) 如前所述,你做不到. 可能的解决方案是实现存储的函数,例如: CREATE FUNCTION v_emp (@pintEno INT) RETURNS T ...

  2. python cmd命令 循环传参数_将参数从cmd传递给python脚本

    我在 python中编写脚本并通过输入以下命令运行cmd: C:\> python script.py 我的一些脚本包含基于标志调用的单独算法和方法. 现在我想通过cmd直接传递标志,而不是必须 ...

  3. python线程协程进程的区别_进程和线程、协程的区别

    现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来.python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程.本文主要介绍进程.线程和协程三者之间的区 ...

  4. python 分类变量转为哑变量_机器学习笔记——哑变量处理

    在机器学习的特征处理环节,免不了需要用到类别型特征,这类特征进入模型的方式与一般数值型变量有所不同. 通常根据模型的需要,类别型特征需要进行哑变量处理,即按照特征类别进行编码,一般一个类别为k的特征需 ...

  5. python字典修改键所对应值_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

  6. MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量

    文章目录 MySQL 变量分类 系统变量 查看系统变量 设置系统变量 如何通过配置文件来设置变量值 通过命令行选项来设置变量值 动态设置全局级的系统变量 设置静态的系统变量 设置会话级的系统变量 引用 ...

  7. python 相关性检验怎么计算p值_收藏 | 大神教你用Python预测未来:一文看懂时间序列...

    (由Python大本营付费下载自视觉中国) 作者 |  Leandro Rabelo 译者 | 李洁 整理 | Lemonbit 出品 | Python数据之道 本文内容较长,较为详细的阐述了进行时间 ...

  8. css 变量_如何将CSS变量用于动画

    css 变量 当我们在讨论中提到CSS时,我们通常将其称为愚蠢的语言. 一种声明性语言,缺乏逻辑和洞察力: 但这不是真实的现实. 多年来,开发人员一直渴望标准CSS中的变量,长期以来一直被诸如LESS ...

  9. java程序中执行maven_java – 将一个enviornment变量传递给Maven中的已执行进程

    我一直在墙上撞了大约一个小时:我正试图将一个简单的属性( java.library.path)传递给exec-maven-plugin.目标是将其与Netbeans右键单击文件集成>运行文件过程 ...

最新文章

  1. Exchange Server 2016管理系列课件19.开启和管理存档邮箱
  2. 高斯混合模型(GaussianMixture Model, GMM)聚类、可视化最优协方差形式、通过TSNE进行结果可视化分析、抽取核心特征因子
  3. shell脚本提取服务器一段时间的日志并输出异常结果
  4. 高清精美壁纸:2013年9月桌面日历壁纸免费下载
  5. 吴裕雄--天生自然 高等数学学习:平面及其方程
  6. MySQL行锁 表锁理解
  7. ZetCode C#/vb.net 教程
  8. mybatis mapper配置 bigint_Mybatis-Plus入门
  9. tensorflow随笔——图像分类、检测,语义分割综述
  10. java mysql大小写_java – 使用select where where Mysql在Mysql中区分大小写
  11. win10 使用cmake编译opencv源码生成VS工程(二)
  12. 这是你所了解的FaaS 么?——无服务计算的10个思考
  13. 华为手机 图标消失_华为手机桌面图标不见了怎么办
  14. XUI 一个简洁而优雅的Android原生UI框架,解放你的双手!
  15. Linux搭建测试环境步骤
  16. 常见的国家语言缩写以及语言的代码
  17. Golang中的并发:如何使用Goroutines?详细指南
  18. macd 公式 java_EMA指标和MACD指标的JAVA语言实现
  19. 继电器分类及性能对比
  20. 运动无线耳机哪个品牌比较好、口碑最好的运动蓝牙耳机

热门文章

  1. 第 8 章 配置listener监听器
  2. 拼音输入法功能大比拼
  3. oracle 位移运算符,Oracle“(+)”运算符
  4. mysql concat例子_MYSQL中CONCAT详解
  5. Django REST framework 认证、权限和频率组件
  6. python编程中的if __name__ == 'main': 的作用和原理[2]
  7. VS2010调试快捷键
  8. elasticsearch java_java Elasticsearch详细介绍及使用实例分析
  9. 二维数组数和指针操作的理解
  10. matlab中关于@的作用(函数表达式句柄)