行书多次同时放在Python 2.7(running script multiple times s

2019-08-19 21:17发布

你好我想运行一个脚本多次,但希望这发生在同一时间,从我的理解,我是用子进程和线程一起然而,当我运行它,它仍然看起来像正在执行顺序可以有人帮忙它我,这样我可以得到它一遍又一遍,但在同一时间运行相同的脚本? 它是实际上的工作,只是很慢?

编辑现在忘记过去的一段代码在底部

这里是我到目前为止

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

Answer 1:

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


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

然后我填充“newscript”文件夹中有一堆针对其运行脚本“的.htm”文件。

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

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

你的代码确实激发关闭后台运行多个进程。 我这样做是用含200个文件夹newscript,我看200点的过程都在后台运行。

你指出,你希望他们在同一时间后台运行的所有。

在大多数情况下,并行处理在后台运行“大致”在平行的,但由于大多数常用的操作系统是设置的方式,“平行”更像“几乎平行的”,或者更通常被称为异步。 如果您在访问时间看起来非常密切,以这种方式催生了各种工艺将分别转一转,但他们绝不会都做在同一时间的东西。

这是一个需要注意的。 特别是因为你正在访问的操作系统和底层文件系统控制的文件。

对于你正在尝试做的:过程一堆文件入境,你是如何做的基本上是关闭产卵的过程来处理在后台显示每个文件的文件。

有一对夫妇与逻辑问题所呈现:

  1. 的fork炸弹的情况高风险,因为你的产卵是无界的,也没有什么仍然是催生跟踪。
  2. 您正在产卵的方式,通过调用并执行在OS层面的过程另一个程序正在导致产生了,这是资源较多。

建议:

相反,产卵关工作,你会更好些,你会产卵的文件处理代码,并把它变成一个Python功能。 重新编写代码作为守护进程的过程中,其手表的文件夹和跟踪的多少进程正在催生,使背景的水平处理移交文件转换管理。

当处理文件时,你将剥离一个Python线程来处理它,这将是一个重量更轻的替代产卵关闭操作系统级线程。



Answer 3:

有一点阐述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)

此外,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将在并行的方式创建所需目录所需的文件!



文章来源: running script multiple times simultaniously in python 2.7