首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python/Flask/Waitress进行多线程会导致重复的输出

使用Python/Flask/Waitress进行多线程会导致重复的输出
EN

Stack Overflow用户
提问于 2020-07-04 04:06:41
回答 1查看 673关注 0票数 0

我有一个Python Flask服务器,它在一个路由上提供文档文件,将它们保存到一个作业特定的文件夹中,然后当所有的.docx文件都上传完后,一个新的路由会触发一个批处理的多线程作业来将它们转换为PDF。

问题是,如果我从同一客户端发送第二个请求,请求不同的作业,第一个作业可以正常完成,但第二个和后续作业将处理第一个和第二个作业中请求的所有文件,并将它们复制到第二个或后续输出文件夹中。

路由:

代码语言:javascript
复制
@app.route('/docxgroupproc2',methods=['GET'])
def docgroupproc2():
    startTime=datetime.now()
    jobid=request.args.get('jobid')
    newPath, jobPath, outPath=paths('',str(jobid))
    localdata=local()
    localdata2=local()
    localdata.value=jobPath
    localdata2.value=outPath
    mtThread= Thread(target=mtconvDOCX.bleck, args=(localdata.value,localdata2.value),daemon=True)
    mtThread.setDaemon(True)
    mtThread.start()
    print("Thread Started")
    mtThread.join()    
    endTime=datetime.now()
    print(endTime-startTime)
    return ({'completed': "status"})

多线程模块:

代码语言:javascript
复制
 def parseDOCS(outPath,file):
    comtypes.CoInitialize()
    word=comtypes.client.CreateObject('Word.Application')
    word.Visible=False
    doc= word.Documents.Open(file,Visible=False)
    outFile = os.path.join(outPath,str(os.path.splitext(os.path.basename(file))[0] + ".PDF"))
    try:
        doc.SaveAs(outFile, FileFormat=wdFormatPDF)
    except COMError:
        res = "FAIL"
    else:
        res = "SUCCESS"
    finally:
        doc.Close()
        word.quit()
    return    

        
def setupParse(dir,fileCounter=0,TotalFileCounter=0,fileslist=[]):
    "return number of files in dir"
    for files in os.scandir(dir):
        if files.is_file():
            fileCounter+=1
            TotalFileCounter=+1
            fileslist.append(files.path)
    text="DOCX Files" + " : " + str(fileCounter) + "\ntotal files: " + str(TotalFileCounter)
    print(fileCounter)
    #dictlist=map([(x,outPath) for x in [fileslist]])
    return text, fileCounter, TotalFileCounter, fileslist



def bleck(dir, outPath):
    text, fileCounter, TotalFileCounter, dictlist=setupParse(dir)
    pool=ThreadPool(4)
    #result=pool.starmap_async(parseDOCS,zip(dictlist, repeat(outPath)),chunksize=1)
    result=pool.map_async(partial(parseDOCS,outPath),dictlist)
    while not result.ready():
        print("\rNumber of Files Processed: {}".format(fileCounter-result._number_left+1), end='           ')
        pass
    pool.close()
    pool.join()
    return "completed"
EN

回答 1

Stack Overflow用户

发布于 2020-07-04 05:12:04

代码语言:javascript
复制
def setupParse(dir,fileCounter=0,TotalFileCounter=0,fileslist=[]):

所以这条线就是问题所在。从def行移动声明,然后将它们初始化为停止文件列表中的正确值,以防止每个线程/作业附加到该列表中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62722076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档