单线程涉及threading.Lock()的意外执行顺序

问题描述 投票:0回答:1

我有一个应用程序,可以为特定实例创建线程,然后将 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 的路径根本不。可能是什么导致了这种结果?

python-multithreading libreoffice
1个回答
0
投票

看起来你可能忘了缩进

   with conversion_lock:
       path_to_pdf = convert_file_to_pdf(target_path)
    
       logger.info(f"Path to pdf:{path_to_pdf}")

最后一行。

© www.soinside.com 2019 - 2024. All rights reserved.