python多线程连接导致挂起

时间:2014-03-28 12:11:39

标签: python multithreading join

我在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 

2 个答案:

答案 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只是为了进一步简化代码。