我有一个应用程序,可以为特定实例创建线程,然后将 Word 文档转换为 pdf 文件。看起来像这样
@app.route('/cont')
def create_pdf():
id = request.args.get('id')
logger.info(f"Received - ID: {id}")
helper = threading.Thread(target=cont_helper,args=(id,))
helper.start()
return jsonify({"message": "Received"})
现在我使用 libreoffice 进行文件转换,但由于 libreoffice 显然不是线程安全的,所以我使用
threading.Lock()
的实例。
conversion_lock = threading.Lock()
def convert_file_to_pdf(file_path):
subprocess.run( f'libreoffice --headless --convert-to pdf {file_path}', shell=True)
pdf_file_path = f'{file_path.split(".")[0]}.pdf'
return pdf_file_path
def contract_helper(id):
.
.
.
with conversion_lock:
path_to_pdf = convert_file_to_pdf(target_path)
logger.info(f"Path to pdf:{path_to_pdf}")
.
.
.
同时创建多个线程,但除了与libreoffice转换外,没有任何共享资源。
现在根据日志文件的问题是,例如,线程 A 进行转换,这意味着它已获取锁,然后打印 pdf 路径,但有时另一个线程在没有尝试转换的情况下打印 pdf 的路径根本不。可能是什么导致了这种结果?
看起来你可能忘了缩进
with conversion_lock:
path_to_pdf = convert_file_to_pdf(target_path)
logger.info(f"Path to pdf:{path_to_pdf}")
最后一行。