繁体   English   中英

Python 多线程没有正确地从队列中取出

[英]Python MultiThreading Not Taking From Queue Properly

我正在一次解析大量文档,为此我集成了一个包含文档列表的队列,之后我分配线程来运行解析 pdf 文件到队列为空它应该返回我的结果,但是当我输出队列的大小时,即使多个线程正在运行它也会输出相同的数字,这意味着某些线程获得相同的 pdf,我相信我的线程系统效率低下并且想要任何输入来使这个解析和运行更快,这是我当前的代码。

    def searchButtonClicked(self):
        name = self.lineEdit.text()
        self.listWidget.addItem("Searching with the name: " + name)
        num_threads = 35
        try:
            with open("my_saved_queue.obj","rb") as queue_save_file:
                self.my_loaded_list: Queue = pickle.load(queue_save_file)
                self.my_loaded_queue = queue.Queue()
                for row in self.my_loaded_list:
                    self.my_loaded_queue.put(row)
                for i in range(num_threads):
                    worker = threading.Thread(target=self.searchName, args=(name,))
                    worker.setDaemon(True)
                    worker.start()
        except:
            self.saveFile()
            self.searchButtonClicked()

    def saveFile(self):
        my_queue = list()
        for root, dirs, files in os.walk(self.directory):
            for file_name in files:
                file_path = os.path.join(root, file_name)
                if file_path.endswith(".pdf"):
                    my_queue.insert(0,[PyPDF2.PdfFileReader(file_path, strict=False), file_path])
        with open("my_saved_queue.obj","wb+") as queue_save_file:
            pickle.dump(my_queue, queue_save_file)

    def searchName(self, name):
        try:
            queue_obj = self.my_loaded_queue.get(False)
        except Empty:
            self.my_loaded_queue.task_done()
            self.listWidget.addItem("---------------Done---------------")
        else:
            pdf_object = queue_obj[0]
            file_path = queue_obj[1]
            num_of_pages = pdf_object.getNumPages()

            for i in range(0, num_of_pages):
                PageObj = pdf_object.getPage(i)
                Text = PageObj.extractText() 
                ResSearch = re.search(name, Text)
                if(ResSearch):
                    print(file_path + " Page " + str(i+1))
                    self.listWidget.addItem(file_path + " Page" + str(i+1))
                    continue
                else:
                    continue
            print(self.my_loaded_queue.qsize())
            if not self.my_loaded_queue.empty():
                self.searchName(name)

    def clearListWidget(self):
        self.listWidget.clear()

本质上,我解析目录并将所有 pdf 存储到一个列表中,然后我将其保存回目录以在搜索名称时访问,这样可以节省时间,而且我不必解析所有 pdf。 这是在 searchName() 底部输出 qsize 时的输出: 在此处输入图片说明

正如我们所看到的,有时它会多次输出大小,这意味着多个线程,即使一开始我们离开队列的顶部,这应该删除一些大小。

这是正常的。

这可能按以下顺序发生:

线程 1 从队列中获取一个对象。
线程 2 从队列中获取一个对象
线程 2 打印尺寸
线程 1 打印尺寸

但这不是问题。 该程序可以完美运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM