Python 使用线程读取文件并传递数据
我在研究Python和线程,更具体地说,是从线程中调用的方法返回数据。我所有的研究都导致排队。然而,我不确定我是否真正正确地实现了它,我有一个问题Python 使用线程读取文件并传递数据,python,multithreading,python-3.x,io,Python,Multithreading,Python 3.x,Io,我在研究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() b
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())
问题:
queue.join()
,这里需要它吗线程的主要问题是确保没有任何东西会爆炸,或者如果有什么东西会爆炸,那么您已经涵盖了该场景,并且您愿意让它爆炸。考虑到这一点,以及在不牺牲多线程的好处的情况下,用当前的操作系统体系结构自动化线程的这一部分是不可行的,让我们来了解您的选择和实现的正确性
def construct_list(read_file, backup):
with open(read_file) as read_obj:
backup.put(read_obj.readlines())
backup.task_done()
好吧,你好像把这东西倒过来了。如果您读取了一些内容,并根据这些内容将数据/命令/任何内容发布到流程队列中,则不会调用task\u 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\u done()
call发出任务已完成的信号
最后,在这种情况下,不需要对队列调用join()
@编辑:至于第二个问题
,当使用while循环打印队列时,它是这样打印的:['KeePass']没有['']我怎么能打印它而只得到普通字符串KeePass?
-这与线程和队列都无关。这是一个使用readlines()
读取文件内容并将结果转储到备份列表中的问题。我相信您正在研究连续读取文件的示例,然后将这些结果拆分为一行,或者更合适地使用read()
。1。不确定python线程库2。你不是在打印一个列表吗?请尝试备份列表。改为获取()[0]。在不深入代码的情况下,备份列表是否应该包含超过1个元素?您是否正在尝试打印其中的所有项目?为什么不直接对备份列表中的项执行:打印(项)
@bhow-但是如果列表中还有其他项,我必须获得队列的长度,根据长度运行一个for循环,并将其插入[]
@bhow-因为队列不能使用for循环进行迭代,我尝试了这个,它抛出了一个错误你是如何学习多线程的?你使用了什么资源?