【问题标题】:read a variable while multithreading多线程时读取变量
【发布时间】:2017-09-13 12:46:50
【问题描述】:

我从一个 API 获得两个数据流,所以有 3 个线程,主线程,stream1 和 stream2。 Stream1 和 Stream2 需要处理这些数据,完成后将它们存储在 main_value1 和 main_value2 中。

我需要在任何给定时间从主线程读取最后一个值(所以如果我需要这个值并且它仍在处理中,那么我会得到最后一个处理/存储的值),最佳方式是什么?从这里的代码示例中,我需要帮助编写函数 get_main_value1(),当然还有 get_main_value2()

def stream1():
    while True:
         main_value1 = process()
def stream2():
    while True:
        main_value2 = process2()
def get_main_value1(): ?
def get main_value2(): ?
def main():
    threading.Thread(function=stream1,).start()
    threading.Thread(function=stream2).start()
    while True:
        time.sleep(random.randint(0,10))
        A = get_main_value1()
        B = get_main_value2()

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    一种方法是让它们全球化:

    STREAM1_LAST_VALUE = None
    def stream1():
        global STREAM1_LAST_VALUE
        while True:
             main_value1 = process()
             STREAM1_LAST_VALUE = main_value1
    
    STREAM2_LAST_VALUE = None
    def stream2():
        global STREAM2_LAST_VALUE
        while True:
            main_value2 = process2()
            STREAM2_LAST_VALUE = main_value2
    
    def get_main_value1():
        return STREAM1_LAST_VALUE
    
    def get main_value2():
        return STREAM2_LAST_VALUE
    
    def main():
        threading.Thread(function=stream1,).start()
        threading.Thread(function=stream2).start()
        while True:
            time.sleep(random.randint(0,10))
            A = get_main_value1()
            B = get_main_value2()
    

    【讨论】:

    • 也许这是一个愚蠢的问题:如果我需要这个值,而它是由函数设置的呢?会发生什么,或者这不可能发生?
    • @FroidDymylja 我不确定我是否理解。如果您查看我的代码process2() 返回一个值,然后覆盖STREAM2_LAST_VALUE。因此没有中间状态是可能的。 process2() 也总是看到最后一个值,所以它可以安全地使用它。如果您直接对STREAM2_LAST_VALUE 对象进行更新,则可能会出现不一致。在 Python 中保证了简单读写的一致性。
    • “Python中保证简单读写的一致性”?你能提供一个链接来阅读这个吗?
    • @stovfl docs.python.org/2/faq/… 那里有一个原子操作列表(不确定是否完整,但对于我们的案例来说已经足够了)。抱歉回复晚了,错过了评论。
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2021-08-16
    • 2013-03-17
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    相关资源
    最近更新 更多