你好我试图多次运行一个脚本,但是希望这可以同时发生,我理解的是使用子进程和线程一起 然而,当我运行它仍然看起来它是按顺序执行可以有人帮助我,以便我可以让它一遍又一遍地运行相同的脚本但同时? 它实际上是在工作还是非常慢?
编辑忘记了现在底部的最后一段代码
这是我到目前为止所拥有的
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()
答案 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个进程都在后台运行。
您注意到您希望它们同时在后台运行。
在大多数情况下,并行进程在后台“大致”并行运行,但由于大多数常见操作系统的设置方式,“并行”更像是“几乎并行”或更常见的异步。如果你非常仔细地查看访问时间,那么以这种方式产生的各种进程将会转向,但它们将永远不会同时执行任何操作。
这是需要注意的事情。特别是因为您正在访问由操作系统和底层文件系统控制的文件。
对于你要做的事情:处理一堆入站文件,你如何做它基本上产生一个进程来处理后台出现的每个文件的文件。
提出的逻辑有几个问题:
<强>建议:强>
您最好不要生成要生成的文件处理代码并将其转换为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 ,它将以并行方式在所需目录中创建所需文件!