Python多线程的join导致卡死

1 投票
2 回答
1547 浏览
提问于 2025-04-18 00:19

我在用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 里有东西。

撰写回答