簡體   English   中英

在python 2.7中同時運行腳本多次

[英]running script multiple times simultaniously in python 2.7

您好,我嘗試多次運行腳本,但是我想同時使用子進程和線程將其同時進行,但是當我運行它時,它仍然看起來像是按順序執行,有人可以幫忙嗎我,這樣我就可以讓它一遍又一遍地運行相同的腳本? 它真的有效並且真的很慢嗎?

編輯現在忘記了最后的代碼

這是我到目前為止所擁有的

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

就個人而言,我將使用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)

跑一些快速測試。 使用腳本框架:

#!/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. 通過調出並執行另一個程序來生成的方式導致生成OS級別的進程,這會占用更多資源。

建議:

與其生成工作,不如獲取將要生成的文件處理代碼並將其轉換為Python函數。 將代碼重新編寫為守護進程,該守護進程將監視文件夾並跟蹤生成的進程數,以便管理處理文件轉換的后台進程級別。

處理文件時,您將剝離一個Python線程來處理該文件,這比產生OS級別的線程要輕得多。

詳細說明了米爾森的答案:

假設我們有一個example1文件夾。
在example1內部,我們有兩個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)

另外, 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 ,它將以並行方式在所需目錄中創建所需文件!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM