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

时间:2013-04-05 18:03:59

标签: python asynchronous python-2.7 subprocess python-multithreading

你好我试图多次运行一个脚本,但是希望这可以同时发生,我理解的是使用子进程和线程一起 然而,当我运行它仍然看起来它是按顺序执行可以有人帮助我,以便我可以让它一遍又一遍地运行相同的脚本但同时? 它实际上是在工作还是非常慢?

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

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

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()

3 个答案:

答案 0 :(得分:3)

就个人而言,我会使用multiprocessing。我写了一个函数,它接受一个文件名并执行execution的主要内容(可能通过导入execution并在其中运行某些函数):

import multiprocessing
import execution
import datetime

#assume we have a function:
#exection.run_main_with_args(filename,name,today_str,dbfolder)

today = datetime.datetime.today()
def my_execute(filename):
    if '.htm' in filename:
       name = filename.strip('.htm')
       dbfolder = "C:/newscript/db/" + name
       os.makedirs(dbfolder)
       execution.run_main_with_args(filename,name,str(today),dbfolder)

p = multiprocessing.Pool()
p.map(my_execute,list_of_files_to_process)

答案 1 :(得分:2)

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

#!/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()

然后我用“.htm”文件填充了“newscript”文件夹,以便对其运行脚本。

“busy.sh”基本上是:

#!/usr/bin/env bash
while :
do
    uptime >> $$
    sleep 1
done

您拥有的代码确实触发了在后台运行的多个进程。我用包含200个文件的newscript文件夹做了这个,我看到200个进程都在后台运行。

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

在大多数情况下,并行进程在后台“大致”并行运行,但由于大多数常见操作系统的设置方式,“并行”更像是“几乎并行”或更常见的异步。如果你非常仔细地查看访问时间,那么以这种方式产生的各种进程将会转向,但它们将永远不会同时执行任何操作。

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

对于你要做的事情:处理一堆入站文件,你如何做它基本上产生一个进程来处理后台出现的每个文件的文件。

提出的逻辑有几个问题:

  1. 叉形炸弹的风险很高,因为你的产卵是无限制的,并且没有跟踪仍然产生的东西。
  2. 通过调出并执行另一个程序产生的方式会导致生成操作系统级别的进程,这会占用更多资源。
  3. <强>建议:

    您最好不要生成要生成的文件处理代码并将其转换为Python函数,而不是产生作业。将代码重写为守护进程,该进程监视文件夹并跟踪生成的进程数,以便管理处理文件转换的后台进程级别。

    处理文件时,你会分离一个Python线程来处理它,这将是产生OS级别线程的一个更轻量级的替代方案。

答案 2 :(得分:0)

一点点阐述mgilson的答案:

我们说我们有一个文件夹example1 在example1中我们有两个python脚本:
execution.py main.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)

此外, main.py 的内容如下所示:

#!/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 ,它将以并行方式在所需目录中创建所需文件!