gpt4 book ai didi

python - 使用线程读取文件并传递数据

转载 作者:行者123 更新时间:2023-12-01 02:31:30 25 4
gpt4 key购买 nike

我正在研究 Python 和线程,更具体地说,是从线程中调用的方法返回数据。我所有的研究都指向队列。但是,我不确定我是否真正正确地实现了它,并且我有一个问题。

import threading
import queue


def construct_list(read_file, backup):
with open(read_file) as read_obj:
backup.put(read_obj.readlines())
backup.task_done()


backup_list = queue.Queue()
read_thread = threading.Thread(target=construct_list, args=("list.txt", backup_list,))


read_thread.start()
read_thread.join()

while backup_list.empty() is False:
print(backup_list.get())

问题:

  1. 我是否正确实现和使用了队列?我见过代码调用 queue.join() 的示例,这里需要这样做吗?
  2. 当使用 while 循环打印队列时,它会像这样打印:

    ['KeePass']如何在没有 [''] 的情况下打印它并仅获取纯字符串 KeePass?

最佳答案

线程的主要问题是确保没有任何东西会爆炸,或者如果有东西会爆炸,你已经涵盖了该场景并且你愿意让它爆炸。考虑到这一点,并且事实上,在不牺牲多线程优势的情况下,没有可行的方法可以使用当前操作系统架构来自动化这部分线程,让我们了解您的选择和实现的正确性。

def construct_list(read_file, backup):
with open(read_file) as read_obj:
backup.put(read_obj.readlines())
backup.task_done()

好吧,你似乎把这件事搞反了。如果您阅读了某些内容并根据该内容将数据/命令/任何内容发布到队列中等待处理,则您不会调用 task_done() 因为您只请求完成一项任务。当您发布此类请求时,您并未执行该任务。

这里的第二个问题是将这些命令写入队列而没有超时。默认情况下,queue.put() 是阻塞的并且没有超时,这不是一个错误,我只是指出这一点以确保这是有意识的决定,并且在以下情况下必须考虑到这一点:扩展此示例的功能。

read_thread.start()
read_thread.join()

嗯...这实际上违背了多线程的整个想法。想法是能够并行执行多个任务,通过调用join(),您将阻塞主线程,直到工作线程完成。这基本上意味着您创建一个线程并执行所有操作的速度比单个线程慢两倍。使用队列的整个想法是让多个线程在它们都运行时相互通信。您不应该以这种方式加入其他线程,只需在不再需要它并且队列已被处理后才执行。

while backup_list.empty() is False:
print(backup_list.get())

首先,您不应该假设如果 empty() 返回 False 您的 get() 调用不会阻塞。如果主线程是 GUI 线程或任何其他需要连续运行的变体,您可能希望使用非阻塞调用来调用它,并通过跳过来处理非处理项。

其次,由于该队列用于通信,因此这是您想要发出任务已完成信号的地方。您的任务是对传递到队列的元素调用 print() 函数。在该元素上调用 print 后,您可以通过 task_done() 调用来表示任务已完成。

最后,在这种情况下不需要在队列上调用join()

@edit:至于第二个问题当使用 while 循环打印队列时,它会像这样打印: ['KeePass'] 如何在没有 [''] 的情况下打印它并只获取纯字符串KeePass? - 这与线程和队列都无关。这是您使用 readlines() 读取文件内容并将结果转储到备份列表中的问题。我相信您正在研究连续读取文件的示例,然后将这些结果拆分为单行或更合适地使用 read() 代替。

关于python - 使用线程读取文件并传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com