在python 2.7中多次同时运行脚本

在python 2.7中多次同时运行脚本,python,asynchronous,python-2.7,subprocess,python-multithreading,Python,Asynchronous,Python 2.7,Subprocess,Python Multithreading,您好,我试图多次运行一个脚本,但希望它同时运行,因为我知道我将同时使用子进程和线程 但是,当我运行它时,它看起来仍然是按顺序执行的。有人能帮助我让它在同一时间反复运行同一个脚本吗? 它是否真的在工作,而且速度真的很慢 编辑忘记了底部的最后一段代码 这是我到目前为止所拥有的 import os import datetime import threading from subprocess import Popen today = datetime.date.today() os.makedir

您好,我试图多次运行一个脚本,但希望它同时运行,因为我知道我将同时使用子进程和线程 但是,当我运行它时,它看起来仍然是按顺序执行的。有人能帮助我让它在同一时间反复运行同一个脚本吗? 它是否真的在工作,而且速度真的很慢

编辑忘记了底部的最后一段代码

这是我到目前为止所拥有的

import os
import datetime
import threading
from subprocess import Popen

today = datetime.date.today()
os.makedirs("C:/newscript_image/" + str(today))

class myThread(threading.Thread):
    def run(self):
        for filename in os.listdir('./newscript/'):
            if '.htm' in filename:
                name = filename.strip('.htm')

                dbfolder = "C:/newscript/db/" + name
                os.makedirs(dbfolder)

                Popen("python.exe C:/execution.py" + ' ' + filename + ' ' + name + ' ' + str(today) + ' ' + dbfolder)
myThread().start()

就个人而言,我会使用
多处理
。我会编写一个函数,它接受一个文件名并执行
执行的主要部分所做的任何事情(可能通过导入
执行
并在其中运行一些函数):


就个人而言,我会使用
多处理
。我会编写一个函数,它接受一个文件名并执行
执行的主要部分所做的任何事情(可能通过导入
执行
并在其中运行一些函数):


进行了一些快速测试。使用脚本的框架:

#!/usr/bin/env python

import os
import threading
from subprocess import Popen

class myThread(threading.Thread):
    def run(self):
        for filename in os.listdir("./newscript/"):
            if '.htm' in filename:
                Popen("./busy.sh")

myThread().start()
然后,我在“newscript”文件夹中填充了一堆要运行脚本的“.htm”文件

其中“busy.sh”基本上是:

#!/usr/bin/env bash
while :
do
    uptime >> $$
    sleep 1
done
您拥有的代码确实触发了在后台运行的多个进程。我用一个包含200个文件的newscript文件夹完成了这项工作,我看到200个进程都在后台运行

您注意到希望它们同时在后台运行

在大多数情况下,并行进程在后台“大致”并行地运行,但由于大多数常见操作系统的设置方式,“并行”更像是“近似并行”或更常见的异步方式。如果仔细观察访问时间,以这种方式生成的各种进程都会轮流运行,但它们永远不会同时执行某些操作

这是需要注意的。尤其是因为您正在访问由操作系统和底层文件系统控制的文件

对于您试图做的事情:处理一堆入站文件,您的做法基本上是派生一个进程,在后台为每个出现的文件处理该文件

呈现的逻辑有几个问题:

  • 叉式炸弹情况的高风险,因为您的产卵是无限的,并且没有对仍然产卵的跟踪
  • 通过调用和执行另一个程序生成的方式会生成一个操作系统级进程,这是一种资源密集型进程
  • 建议:

    与其派生作业,不如将要派生的文件处理代码转换为Python函数。以守护进程的形式重新编写代码,守护进程监视文件夹并跟踪生成的进程数量,以便管理处理文件转换的后台进程级别


    在处理该文件时,您将派生一个Python线程来处理它,这将是一个比派生一个操作系统级线程更轻的替代方法。

    运行了一些快速测试。使用脚本的框架:

    #!/usr/bin/env python
    
    import os
    import threading
    from subprocess import Popen
    
    class myThread(threading.Thread):
        def run(self):
            for filename in os.listdir("./newscript/"):
                if '.htm' in filename:
                    Popen("./busy.sh")
    
    myThread().start()
    
    然后,我在“newscript”文件夹中填充了一堆要运行脚本的“.htm”文件

    其中“busy.sh”基本上是:

    #!/usr/bin/env bash
    while :
    do
        uptime >> $$
        sleep 1
    done
    
    您拥有的代码确实触发了在后台运行的多个进程。我用一个包含200个文件的newscript文件夹完成了这项工作,我看到200个进程都在后台运行

    您注意到希望它们同时在后台运行

    在大多数情况下,并行进程在后台“大致”并行地运行,但由于大多数常见操作系统的设置方式,“并行”更像是“近似并行”或更常见的异步方式。如果仔细观察访问时间,以这种方式生成的各种进程都会轮流运行,但它们永远不会同时执行某些操作

    这是需要注意的。尤其是因为您正在访问由操作系统和底层文件系统控制的文件

    对于您试图做的事情:处理一堆入站文件,您的做法基本上是派生一个进程,在后台为每个出现的文件处理该文件

    呈现的逻辑有几个问题:

  • 叉式炸弹情况的高风险,因为您的产卵是无限的,并且没有对仍然产卵的跟踪
  • 通过调用和执行另一个程序生成的方式会生成一个操作系统级进程,这是一种资源密集型进程
  • 建议:

    与其派生作业,不如将要派生的文件处理代码转换为Python函数。以守护进程的形式重新编写代码,守护进程监视文件夹并跟踪生成的进程数量,以便管理处理文件转换的后台进程级别


    在处理该文件时,您将派生一个Python线程来处理它,这将是一个比派生一个操作系统级线程更轻的替代方案。

    mgilson的回答:

    假设我们有一个文件夹示例1。
    在示例1中,我们有两个python脚本:
    execution.pymain.py

    execution.py的内容如下所示:

    import subprocess
    
    
    def run_main_with_args(filename,name,today,dbfolder):
        print('{} {} {}'.format('\nfilename: ',filename, ''))
        print('{} {} {}'.format('name: ',name, ''))
        print('{} {} {}'.format('today: ',today, ''))
        print('{} {} {}'.format('dbfolder: ',dbfolder, ''))
    
        outfile = dbfolder+ '/' + name + '.txt'
        with open (outfile, 'w') as fout:
            print('name', file=fout)
    
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    # Author      : Bhishan Poudel; Physics Graduate Student, Ohio University
    # Date        : Aug 29, 2016
    #
    
    # Imports
    import multiprocessing,os,subprocess
    import datetime
    import execution  # file: execution.py
    
    #assume we have a function:
    #exection.run_main_with_args(filename,name,today_str,dbfolder)
    
    today = datetime.datetime.today()
    def my_execute(filename):
        if '.txt' in filename:
           name = filename.strip('.txt')
           dbfolder = "db/" + name
           if not os.path.exists(dbfolder): os.makedirs(dbfolder)
           execution.run_main_with_args(filename,name,str(today),dbfolder)
    
    
    
    p = multiprocessing.Pool()
    p.map(my_execute,['file1.txt', 'file2.txt'])
    
    另外,main.py的内容如下所示:

    import subprocess
    
    
    def run_main_with_args(filename,name,today,dbfolder):
        print('{} {} {}'.format('\nfilename: ',filename, ''))
        print('{} {} {}'.format('name: ',name, ''))
        print('{} {} {}'.format('today: ',today, ''))
        print('{} {} {}'.format('dbfolder: ',dbfolder, ''))
    
        outfile = dbfolder+ '/' + name + '.txt'
        with open (outfile, 'w') as fout:
            print('name', file=fout)
    
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #
    # Author      : Bhishan Poudel; Physics Graduate Student, Ohio University
    # Date        : Aug 29, 2016
    #
    
    # Imports
    import multiprocessing,os,subprocess
    import datetime
    import execution  # file: execution.py
    
    #assume we have a function:
    #exection.run_main_with_args(filename,name,today_str,dbfolder)
    
    today = datetime.datetime.today()
    def my_execute(filename):
        if '.txt' in filename:
           name = filename.strip('.txt')
           dbfolder = "db/" + name
           if not os.path.exists(dbfolder): os.makedirs(dbfolder)
           execution.run_main_with_args(filename,name,str(today),dbfolder)
    
    
    
    p = multiprocessing.Pool()
    p.map(my_execute,['file1.txt', 'file2.txt'])
    

    然后,如果我们运行这个main.py,它将以parallel的方式在所需的目录中创建所需的文件

    有点详细介绍一下米吉尔森的回答:

    假设我们有一个文件夹示例1。
    内部示例