多线程Python:线程通信
我正在使用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