我在python中使用线程模块对I / O绑定处理进行一些测试。
基本上,我只是简单地逐行读取文件并将其写出来。
我将读写循环放在不同的线程中,并使用Queue在:
之间传递数据q = Queue()
rt = ReadThread(ds)
wt = WriteThread(outBand)
rt.start()
wt.start()
如果我按上面运行它,它工作正常,但解释程序在执行结束时崩溃。 (任何想法为什么?)
如果我添加:
rt.join()
wt.join()
最后,口译员只是挂起。有什么想法吗?
ReadThread和WriteThread类的代码如下:
class ReadThread(threading.Thread):
def __init__(self, ds):
threading.Thread.__init__(self)
self.ds = ds #The raster datasource to read from
def run(self):
reader(self.ds)
class WriteThread(threading.Thread):
def __init__(self, ds):
threading.Thread.__init__(self)
self.ds = ds #The raster datasource to write to
def run(self):
writer(self.ds)
def reader(ds):
"""Reads data from raster, starting with a chunk for three lines then removing/adding a row for the remainder"""
data = read_lines(ds)
q.put(data[1, :]) #add to the queue
for i in np.arange(3, ds.RasterYSize):
data = np.delete(data, 0, 0)
data = np.vstack([data, read_lines(ds, int(i), 1)])
q.put(data[1,:]) # put the relevant data on the queue
def writer(ds):
""" Writes data from the queue to a raster file """
i = 0
while True:
arr = q.get()
ds.WriteArray(np.atleast_2d(arr), xoff = 0, yoff = i)
i +=1
答案 0 :(得分:0)
如果您的q.get()
为空,则来电Queue
会无限制地阻止。
您可以尝试使用get_nowait()
,但是当您到达writer
功能时,必须确保Queue
中有一些内容。
答案 1 :(得分:0)
wt.join()
等待线程完成,因为q.get()
中writer
周围的无限循环,它永远不会完成。要完成,请添加
q.put(None)
作为reader
的最后一行,并将writer
更改为
def writer(ds):
""" Writes data from the queue to a raster file """
for i, arr in enumerate(iter(q.get, None)):
ds.WriteArray(np.atleast_2d(arr), xoff = 0, yoff = i)
iter(q.get, None)
会产生q
的值,直到q.get
返回None
。我添加enumerate
只是为了进一步简化代码。