Python多线程的join导致卡死
我在用Python的线程模块做一些关于输入输出处理的测试。
简单来说,我就是一行一行地读一个文件,然后同时把它写出去。
我把读取和写入的循环放在不同的线程里,并用一个队列来传递数据:
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
2 个回答
0
wt.join()
会等待线程完成,但由于 writer
中有一个无限循环围绕着 q.get()
,所以它永远不会完成。为了让它能够结束,你需要在
q.put(None)
的最后一行加上,然后把 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
只是为了让代码更简单易懂。
0
调用 q.get()
时,如果你的 Queue
是空的,它会一直卡在那里,不会返回结果。
你可以试试使用 get_nowait()
,但是你得确保在你调用 writer
函数的时候,Queue
里有东西。