我如何 运行 Python 函数在后台处理文件?

How can I run a Python function that handles files in background?

我一直在尝试 运行 使用默认线程库在后台线程中 Python 中的文件处理函数,但 Chrome 选项卡仍在等待 api 完成处理。 我尝试过线程和多处理,但没有成功

这是一个片段:

@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 你可以例如

  1. 运行 python 带有 nohup 命令的脚本。例如。 nohup python3 myscript.py
  2. 如果您的系统使用 systemd,您可以编写一个服务来执行您的脚本。然后你也可以用系统让它自动运行。 更多信息: https://wiki.archlinux.org/index.php/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()方法的文档,它可能已经支持非阻塞方式了。问题是,执行数据传输的方式会有延迟,至少在客户端将数据发布到服务器时是这样。写入磁盘的瓶颈要小得多。

您可以尝试编写一个单独的函数来接收请求对象或文件对象作为参数。在这个函数中,你放置了保存和所有操作文件处理的东西。然后在你路由的烧瓶函数中你 以该函数作为目标启动守护线程,并将请求或文件对象作为参数传递。 return 线程启动后立即重定向。不要忘记调用 Thread().start() 方法。

问题是,flask 什么时候开始接收文件。如果它在路由调用之前立即开始,即在构造请求对象时,这将不起作用。您将不得不另辟蹊径。但是,在这种情况下,我确信 Flask 已经对这些事情有了一些支持。

如果这有效,在客户端,您将遇到相同的行为。浏览器将等待文件传输完毕,然后才对重定向做出反应。为避免这种情况,您将需要 javascript 和 ajax 东西。如果使用 jquery,这将是最简单的。您甚至可以实施进度跟踪,以便用户可以看到已传输了多少文件,以及该过程何时完成,同时,用户将能够使用该网站。

噢,我刚刚想到的最后一件事。如果您遇到另一个客户端在另一个客户端上传文件时无法访问服务器的问题,那么您没有正确启动 flask,这与您的脚本中是否有异步 IO 无关。