多线程Python:线程通信

3 投票
1 回答
8286 浏览
提问于 2025-04-18 00:22

我正在使用Python的threading模块,并且阅读了这个教程这里。我想要实现的程序流程是这样的:我有两个函数foo()bar(),接下来会发生以下事情:

1) foo()运行并收集一些存储在data中的数据,然后停止。

2) 然后bar()开始持续运行,使用data中的数据。

3) 两分钟后,foo()再次运行并更新data,而bar()继续使用旧版本的data

4) 更新成功后,bar()开始使用新版本的data

5) 然后回到第(3)步。

现在我想把这些作为独立的线程来运行,我的问题是foo()怎么告诉bar()它已经完成运行,并且新版本的data可以使用了?

我读过关于Queue的内容,但不太明白在这种情况下该怎么用。

1 个回答

1

这要看“bar”是怎么处理数据的。如果“bar”有一个自然的时机,可以选择使用已有的数据或者新数据,那么它就可以从“foo”填充的队列中读取数据。

def foo(bar_q):
    while True:
        data = get_some_data()
        # copy or deepcopy if foo will be updating data instead of fetching new
        bar_q.put(copy.copy(data))
        time.sleep(120)

def bar(bar_q):
    # wait for the first data
    data = bar_q.get()
    bar_q.task_done()
    while True:
        process_some_data(data)
        try:
            # get new data if available
            data = bar_q.get_nowait()
            bar_q.task_done()
        except Queue.Empty:
            pass

撰写回答