如何运行在后台处理文件的python函数?
我一直在尝试使用默认线程库在后台线程中运行python中的文件处理功能,但chrome选项卡仍在等待api完成处理。 我尝试过线程和多处理,但没有成功 以下是一个片段:如何运行在后台处理文件的python函数?,python,multithreading,python-multithreading,Python,Multithreading,Python Multithreading,我一直在尝试使用默认线程库在后台线程中运行python中的文件处理功能,但chrome选项卡仍在等待api完成处理。 我尝试过线程和多处理,但没有成功 以下是一个片段: @app.route('/', methods=['GET', 'POST']) def hello_world(): if request.method == 'GET': return render_template('upload.html') else: file = re
@app.route('/', methods=['GET', 'POST'])
def hello_world():
if request.method == 'GET':
return render_template('upload.html')
else:
file = request.files['file']
path = os.getcwd() + '\\tempFilesAudio\\'
if not os.path.exists(os.getcwd() + '\\' + 'tempFilesAudio'):
os.mkdir(os.getcwd() + '\\' + 'tempFilesAudio')
if not os.path.exists(os.getcwd() + '\\' + 'tempFilesTransciption'):
os.mkdir(os.getcwd() + '\\' + 'tempFilesTransciption')
file.save(path + secure_filename(file.filename))
file_path = path + file.filename
conv_path = convert(file_path)
print('converted:{}'.format(conv_path))
pr = r.Recogniser()
# this is a thread
Thread(target=pr.recognize(conv_path),daemon=True).start()
return redirect('/')
我不确定我是否理解正确。如果你想在后台运行应用程序,并且你正在linux上工作,你可以
nohup
命令运行python脚本。例如,nohup python3 myscript.py
systemd
,您可以编写一个服务来执行您的脚本。然后,您还可以使其自动运行系统。
更多信息:
我知道你想这么做
from multiprocessing import Pool
# list of variables for Pool
args=[1, 2, 3, 4]
# We want to execute 4 threads at time
pool = Pool(4)
# Executing multithread process, we execute one function by item on the list
# This is like:
# functionName(args[0])
# functionName(args[1])
# functionName(args[2])
# functionName(args[3])
pool.map(functionName, args)
# We wait for the processes to finish
pool.close()
pool.join()
这是正确的吗
如果这是正确的,您也可以按照Nano_developer告诉您的那样使用“nohup”,在不保留会话的情况下执行代码(这是正确的方法),您需要从命令行执行此操作:
nohup python myFile.py
我希望这能有所帮助。现在你想要什么已经很清楚了 要及时保存文件,保存过程必须转到threading.Thread()。不是识别器,或者更好,所有的东西都在一起 另外,您应该查看*.save()方法的文档,它可能已经支持非阻塞方式。问题是,执行数据传输的方式会有延迟,至少在将数据发布到服务器时客户端会有延迟。在这里,写入磁盘的瓶颈要小得多 您可以尝试编写一个单独的函数来接收请求对象或文件对象作为参数。在这个函数中,您可以放置保存和所有操作文件处理内容。然后在你的功能中 以该函数作为目标启动守护进程线程,并将请求或文件对象作为参数传入。并在线程启动后立即返回重定向。不要忘记调用Thread().start()方法 问题是,flask何时开始接收文件。如果它在路由调用之前立即启动,即在构造请求对象时,这将不起作用。你必须找到另一种解决办法。但是,在这种情况下,我相信flask已经得到了一些支持 如果这样做有效,在客户方面,您将体验到同样的行为。浏览器将等待文件传输,然后才对重定向做出反应。为了避免这种情况,您需要javascript和ajax之类的东西。如果使用jquery,这将是最简单的。您甚至可以实施进度跟踪,以便用户可以查看文件的传输量,以及该过程完成时的传输量,同时,用户将能够使用该站点
哦,我刚才想到的最后一件事。如果您遇到另一个客户端在上载文件时无法访问服务器的问题,那么您没有正确启动flask,这与脚本中是否有异步IO无关。您需要更清楚地解释自己。你到底想做什么?在我看来,你需要一个后台运行的进程,而不是线程。还有,也要发布你的代码。比如,“我试过了…”如果你不展示你试过的东西,可能没人能帮你。在问题中加入一些代码,并解释你认为它会做什么。“没有运气”这是什么意思?有错误消息吗?把错误信息放在你的问题中。它有没有以你不明白的其他方式表现?告诉我们它做了什么。我用一个片段更新了这个问题,很抱歉之前写得不好。我有一个flask网站,当我调用api时,它调用了另一个函数。我想让这个内部函数在后台运行,所以线程应该可以完成这项工作。你能粘贴你是如何用线程实现你的功能的吗?@KushSingh:编辑你的Q,并添加这些信息以及更多的说明。但我不知道这与您提到的crone选项卡有何联系。对于给您带来的不便,我已添加了一个片段。谢谢您的指导!我使用pool.apply\u async来实现所需的过程。@KushSingh:使用多处理实现所需的功能可能会使服务器陷入混乱。无论如何,您都在等待处理完成,因此,您实际上什么也得不到。