【发布时间】:2017-06-28 22:32:41
【问题描述】:
代码:
#!/usr/bin/env python
import os
import sys
import threading
class fifo_buffer(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.dict_buffer = {}
def run(self):
path = "/media/ramdisk/sample.fifo"
fifo = open(path, "r")
count = 0
for line in fifo:
count = count + 1
self.dict_buffer[count] = line
#print str(count) + " -> " + self.dict_buffer[count]
fifo.close()
def get_packet(self, index):
return self.dict_buffer[index]
def len_dict(self):
print "Length dict: " + str(len(self.dict_buffer))
def main():
fb = fifo_buffer()
fb.start()
print "get_packet(2): " + fb.get_packet(2) # Input Error
fb.len_dict() # Length showing zero
if __name__ == "__main__":
main()
-
运行函数:
我正在尝试从 fifo 文件中读取数据并将数据存储到字典中。 此运行函数将几乎无限执行。
-
get_packet 或 len_dict 函数:
我正在尝试获取字典的详细信息,但无法这样做。
我的疑问是 run 函数何时将数据从 fifo 文件存储到字典,而假设将无限进行,使用 get_packet 或 len_dict 我想访问此字典数据结构,但无法访问它
我是线程新手,因此也欢迎任何其他方法。
【问题讨论】:
-
首先,缩进错误(代码无法运行)。其次,您启动线程,然后立即尝试获取数据。与其他操作(例如,仅涉及内存)相比,从文件读取(硬盘访问)需要更多时间。您必须 等待 数据在 启动线程后变为可用:
fb.join()([Python]: Thread.join)。但是在这个例子中,我看不到线程的必要性。 -
所以只有调用join()后才能访问字典数据??当 run() 线程无限执行时,他们有什么方法可以访问字典吗?
-
从
fb.start()开始,线程打开文件并开始读取。问题是,在您致电fb.get_packet(2)之前,它无法读取任何内容(原因我在上一条评论中所述)。您可以在两者之间添加一个time.sleep(0.01)(稍微调整一下这个值,看看它什么时候会产生影响)。run方法不会无限运行,直到它完成读取文件,然后线程“死”。您可以在run的开头和结尾以及主线程中添加print语句,以查看它们如何“交互”。 -
实际上它们是另一个不断将数据推送到文件中的代码(确切地说是 TCP/IP 数据包),它将继续无限推送数据,因此文件读取将无限进行。所以当这个文件读取并将数据存储到字典中时,我想访问字典来获取它的元素。所以我需要在加入()之前访问字典。有什么办法吗?
-
线程不会无限运行,因为在某些时候你会耗尽磁盘空间(尽管内存耗尽会更快发生,因为所有文件内容也存储在那里 - 在字典中)。您只能访问字典中已经“写入”的数据,您可以使用
len_dict进行检查。多次调用函数,中间有time.sleep语句,会产生不同的结果(每次调用返回的数字会更大)。
标签: python multithreading python-2.7