Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用子进程运行多个Python脚本的python

使用子进程运行多个Python脚本的python
EN

Stack Overflow用户
提问于 2018-03-13 13:54:23
回答 1查看 2K关注 0票数 2

我想使用concurrent.futures同时运行多个python脚本。我的代码的串行版本会在文件夹中查找特定的python文件并执行它。

代码语言:javascript
运行
AI代码解释
复制
import re
import os
import glob
import re
from glob import glob
import concurrent.futures as cf

FileList = [];
import time
FileList = [];
start_dir = os.getcwd();
pattern   = "Read.py"

for dir,_,_ in os.walk(start_dir):
    FileList.extend(glob(os.path.join(dir,pattern))) ;

FileList

i=0
for file in FileList:
    dir=os.path.dirname((file))
    dirname1 = os.path.basename(dir) 
    print(dirname1)
    i=i+1
    Str='python '+ file
    print(Str)
    completed_process = subprocess.run(Str)`

对于我的代码的并行版本:

代码语言:javascript
运行
AI代码解释
复制
    def Python_callback(future):
    print(future.run_type, future.jid)
    return "One Folder finished executing"

def Python_execute():
    from concurrent.futures import ProcessPoolExecutor as Pool
    args = FileList
    pool = Pool(max_workers=1)
    future = pool.submit(subprocess.call, args, shell=1)
    future.run_type = "run_type"
    future.jid = FileList
    future.add_done_callback(Python_callback)
    print("Python executed")

if __name__ == '__main__':
    import subprocess
    Python_execute()

问题是,我不知道如何传递FileList的每个元素来分离cpu。

谢谢你提前提供帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-13 15:01:16

最小的更改是对每个元素使用一次submit,而不是对整个列表使用一次:

代码语言:javascript
运行
AI代码解释
复制
futures = []
for file in FileList:
    future = pool.submit(subprocess.call, file, shell=1)
    future.blah blah
    futures.append(future)

只有当您想对期货做一些事情时,futures列表才是必需的--等待它们完成,检查它们的返回值,等等。

同时,您正在使用max_workers=1显式创建池。不足为奇的是,这意味着您将只得到一个辅助子进程,因此它将在获取下一个子进程之前等待一个子进程完成。如果您希望实际同时运行它们,请删除该max_workers,并让它默认为每个核心(或者传递max_workers=8或其他不是1的数字,如果您有充分的理由重写默认值)。

当我们正在做这件事时,有很多方法可以简化你正在做的事情:

  • 你真的需要multiprocessing吗?如果您需要与每个子进程进行通信,那么在单个线程中这样做可能会很痛苦--但是线程,或者可能是asyncio,将与这里的进程一样工作。
  • 更重要的是,看起来除了启动流程并等待它完成之外,您实际上并不需要任何东西,这可以在简单的同步代码中完成。
  • 为什么要构建一个字符串并使用shell=1,而不是仅仅传递一个列表而不使用shell?使用shell不必要地造成开销、安全问题和调试麻烦。
  • 在每个将来,您都不需要jid --它只是所有调用字符串的列表,这是没有用的。更有用的是某种标识符,或者子进程返回代码,或者…。可能还有很多其他的东西,但它们都可以通过读取subprocess.call的返回值或简单的包装器来完成。
  • 你也不需要回电话。如果你只是把所有的未来收集在一个列表中,然后as_completed它,你可以打印结果,因为它们显示得更简单。
  • 如果同时执行上述两项操作,则只剩下一个pool.submit --这意味着可以用pool.map替换整个循环。
  • 您很少需要或希望将os.walkglob混合使用。当您实际有一个glob模式时,在来自fnmatchfiles列表上应用os.walk。但是在这里,您只需要在每个dir中寻找一个特定的文件名,所以,真正需要过滤的就是file == 'Read.py'
  • 您没有在循环中使用i。但是,如果您确实需要它,那么最好执行for i, file in enumerate(FileList):,而不是执行for file in FileList:并手动增加i
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49266458

复制
相关文章
java 把文件从一个目录复制到另一个目录
方法一:简单粗暴,直接使用copy(),如果目标存在,先使用delete()删除,再复制;
崔笑颜
2020/06/08
2K0
VBA实战技巧29:从一个工作表复制数据到另一个工作表
今天演示一个简单的例子,也是经常看到网友问的问题,将一个工作表中的数据复制到另一个工作表。
fanjy
2021/07/30
26K1
谁,复制了另一个我?
据媒体报道,在2020年个税年度汇算查询时,有数千名学生发现自己的个人所得税App上有陌生公司的就职记录,也就是“被就业”了! 从被法人!被老赖!被诈骗!被就业!被......!是谁在复制另一个你? “被就业”也许对生活暂时没有影响,但信息泄露有可能让受害人信息在不知情下被进一步滥用,甚至让犯罪记录“从天而降”。 当下,依托人脸核身等AI技术的用户身份认证已成为各行业办理业务不可或缺的环节,但在用户真实意愿校验方面,市场仍缺乏针对性解决此类问题的产品。 在利益驱使下,一方面黑产攻击手法日益复杂,另一
腾讯云AI
2021/12/07
1.7K0
谁,复制了另一个我?
以下文章来源于腾讯云AI ,作者Jerry 据媒体报道,在2020年个税年度汇算查询时,有数千名学生发现自己的个人所得税App上有陌生公司的就职记录,也就是“被就业”了! 从被法人!被老赖!被诈骗!被就业!被......!是谁在复制另一个你? “被就业”也许对生活暂时没有影响,但信息泄露有可能让受害人信息在不知情下被进一步滥用,甚至让犯罪记录“从天而降”。 当下,依托人脸核身等AI技术的用户身份认证已成为各行业办理业务不可或缺的环节,但在用户真实意愿校验方面,市场仍缺乏针对性解决此类问题的产品。 在利
腾讯云TI平台
2022/01/27
1K0
SQL 复制表到另一个表
 INSERT INTO targetTableName SELECT COLUMNS FROM sourceTableName;
星哥玩云
2022/08/18
1K0
TCP流量复制工具,另一个tcpcopy
很多年以前,网易推了一个tcp流量复制工具叫tcpcopy。2013年07月我入职新公司,大概10月份接触到tcpcopy,为tcpcopy修了两个bug,一个是由于公司内网的IP tunnel的问题tcpcopy无法正常工作;另一个是一个严重的性能bug。两个bug都用邮件方式向原作者反馈了,尤其第二个bug原作者在博客上发文感谢。在接下来的二次开发中,由于没办法看懂tcpcopy的tcp会话部分的代码,当时建议作者按照tcp的11个状态写成状态机,作者拒绝了。于是,我根据当时的业务情况重写了一个新的TCPCOPY叫TCPGO。技术原理和tcpcopy是一样的,但tcp会话部分写成了标准 的11个tcp状态的状态机(见源代码中的tcpsession类,漂亮的运行在应用空间而不是内核态的精简的tcp状态机)。另部署方式很不一样,要简单很多。为了开发效率,开发语言用了C++,用了boost库还加了lua帮助写业务代码。
kamuszhou
2018/07/19
8.9K0
TCP流量复制工具,另一个tcpcopy
kettle实现从一个cassandra同步到另一个cassandra
1、拖拽cassandra input、cassandra output控件到工作区,如下图所示:
johnhuster的分享
2022/03/28
7520
kettle实现从一个cassandra同步到另一个cassandra
go :复制文件内容到另一个文件
本文实验,从一个文件拷贝文件内容到另外一个文件 代码 package main import ( "fmt" "io" "os" ) func copyFileContents(src, dst string) (err error) { in, err := os.Open(src) if err != nil { return } defer in.Close() out, err := os.Create(dst)
IT工作者
2022/07/22
5830
java从一个目录拷贝文件到另一个目录下
** * 复制单个文件 * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public void copyFile(String oldPath, String newPath) { try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath
shirayner
2018/08/10
1K0
如何在SQL Server中将表从一个数据库复制到另一个数据库
在某些情况下,作为DBA,您需要将模式和特定表的内容从数据库复制到同一实例中或在不同的SQL实例中,例如从生产数据库中复制特定表到开发人员以进行测试或排除故障。 SQL Server提供了许多方法,可以用来执行表的数据和模式复制过程。为了研究这些方法中的每一个,我们将考虑下面的场景: 托管SQL服务器:localhost。这两个数据库都驻留在同一个SQL Server 2014实例中。 源数据库:AdventureWorks2012。 目标数据库:SQLShackDemo。 将从源数据库复制到目标数据库的表
程序你好
2018/07/20
8.5K0
【秋招】1:机械转码(如何从一个坑,跳到另一个)
一种是直接彻底的转,如果打算直接进军互联网行业,进大厂,拿机械一辈子也可能达不到的高薪并做好了996的准备,那就直接转。
周旋
2022/09/19
1.5K0
【秋招】1:机械转码(如何从一个坑,跳到另一个)
golang把文件复制到另一个目录
//本程序 主要功能是把A文件夹下的文件与B目录下文件对比,如果找到就覆盖到B相应的目录下。 // 用法: merge A目录 B目录 // merge.go package main import ( "flag" "fmt" "os" "path/filepath" "strings" "time" "github.com/Unknwon/com" ) const ( IsDirectory =
李海彬
2018/03/27
1.2K0
golang把文件复制到另一个目录
//本程序 主要功能是把A文件夹下的文件与B目录下文件对比,如果找到就覆盖到B相应的目录下。 // 用法: merge A目录 B目录 // merge.go package main import ( "flag" "fmt" "os" "path/filepath" "strings" "time" "github.com/Unknwon/com" ) const ( IsDirectory =
李海彬
2018/03/27
2.1K0
linux复制文件夹下的所有文件到另一个文件夹_shell复制文件内容到另一个文件
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。 -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。 -f:覆盖已经存在的目标文件而不给出提示。 -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答”y”时目标文件将被覆盖。 -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。 -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。 -l:不复制文件,只是生成链接文件。
全栈程序员站长
2022/09/23
3.9K0
将一个CentOS环境复制到另一个CentOS
将一个CentOS环境复制到另一个CentOs,实现环境迁移或备份的功能 将CentOS2复制一份新的CentOS3出来,步骤如下: 创建新的CentOS3 这里的名称改吃CentOS3,后面的文件改名就是对应的这个名称 ISO映像文件路径修改,每个CentOS单独用一个ISO映像文件 直接启动 修改网络ip cd /etc/sysconfig/network-scripts/ vi ifc
Java廖志伟
2022/09/29
1.6K0
将一个CentOS环境复制到另一个CentOS
使用VBA将图片从一个工作表移动到另一个工作表
今天跟大家分享的技巧来自thesmallman.com,一个分享Excel技巧技术的网站。
fanjy
2022/11/16
4.2K0
使用VBA将图片从一个工作表移动到另一个工作表
将一个CentOS环境复制到另一个CentOS
「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。
Java廖志伟
2022/03/07
5990
将一个CentOS环境复制到另一个CentOS
C# 复制PDF页面到另一个PDF文档
有时候我们可能有这样一个需求,那就是把PDF页面从一个PDF文档复制到另一个PDF文档中。由于PDF文档并不像word文档那样好编辑,因此复制也相对没有那么容易。写这篇文章主要是分享一个简单而且比较容
逸鹏
2018/04/10
1.5K0
C# 复制PDF页面到另一个PDF文档
Java_io_02_从一个目录拷贝文件到另一个目录下
java从一个目录拷贝文件到另一个目录下   http://www.cnblogs.com/langtianya/p/4857524.html
shirayner
2018/08/10
5130
点击加载更多

相似问题

带有斯坦福POS标签的POS直方图

11

斯坦福POS标签返回多个标签

11

斯坦福POS标签OutOfMemoryError阅读标签

16

斯坦福NLP pos标签PRN

11

处理NLTK斯坦福POS标签输出

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档