【发布时间】:2018-03-28 03:50:32
【问题描述】:
我可以启动一个进程并将命令行输出流式传输到模板,直到它结束并在进程运行时使用flask和jinja渲染模板:
@app.route('/tasks/<task>', methods=['GET', 'POST'])
def tasks(task):
running_task = multiprocessing.current_process()
if request.method == 'POST':
if task == 'training':
running_task = train_task(create_path(app.config['ARCHITECTURES_DIRECTORY'],
get('architecture_name') + '.json'),
create_path(app.config['DATASET_DIRECTORY'],
get('dataset_name')),
int(get('desired_image_size')),
int(get('num_epochs')),
int(get('checkpoint_epochs')),
int(get('batch_size')),
'charsets/chars.txt',
float(get('learning_rate')),
get('optimizer'),
getlist('metrics'),
get('loss'))
flash(task + " has started.")
return render_template('tasks.html', task=running_task)
def train_task(architecture_config_file,
dataset_dir,
desired_image_size,
num_epochs,
checkpoint_epochs,
batch_size,
charset_file,
learning_rate,
optimizer,
metrics,
loss):
task = Process(target=train_model,
args=(
architecture_config_file,
dataset_dir,
learning_rate,
metrics,
loss,
optimizer,
desired_image_size,
charset_file,
' ',
num_epochs,
batch_size,
checkpoint_epochs
))
task.start()
return task
我将如何能够做到以下几点:
知道进程是否正在运行。- 如果我不想让它完成,请终止进程。
【问题讨论】:
-
为什么首先将它作为子进程运行?将它作为程序的一部分运行不是更好吗,因为它已经在 Python 中了?
-
如果我不将它作为子进程运行,我将不得不在页面加载之前等待输出。我确实打算先加载页面,然后在进程运行时将输出流式传输到页面中。不幸的是,进程输出将其记录到命令行,我无法控制它。
-
但如果它是一个 Python 进程,应该可以将其更改为不写入
stdout?然后你应该能够将它作为一个线程运行,我想。但也许你不是train.py的作者? -
我不是 train.py 使用的库的作者。
-
好的,这会使事情稍微复杂化,但是您始终可以在调用库函数之前重定向标准输出,然后在调用后将其重置。如果这种情况发生在很多地方,你可以使用装饰器或类似的东西来包装它。它有点复杂,但我仍然更喜欢创建一个子进程,只是为了捕获标准输出。
标签: python flask subprocess