【问题标题】:Python 3.6 updating dict asyncPython 3.6 更新 dict 异步
【发布时间】:2021-06-23 03:53:21
【问题描述】:

您好,我是一名正在研究 Python 3.6 的新人 我想异步更新全局 dict() 。 这是我的虚拟代码:

# prepdt.py
DATA_FROM_PKG = { 'dt1':{}, 'dt2':{} }

def PrepData(data):
    global DATA_FROM_PKG
    if data is not None:
        DATA_FROM_PKG.update(data)
        

# code01.py
from prepdt import PrepData
import time

def func01():
    dt1 = {'dt1':0 }
    a = 0
    while True:
        a += 1
        dt1.update({'dt1':a}) 
        PrepData(dt1)
        time.sleep(1)

func01()

# code02.py
from prepdt import PrepData
import time

def func2():
    dt2 = {'dt2':0 }
    a = 0
    while True:
        a += 1
        dt2.update({'dt2':a})
        PrepData(dt2)
        time.sleep(1)

func2()


#main.py
from prepdt import DATA_FROM_PKG
if __name__ == '__main__':
   while True:
       print(DATA_FROM_PKG)
     

我在终端上运行python3 main.py,我期望的打印结果是:

{'dt1':, 'dt2':}
{'dt1':, 'dt2':}
{'dt1':, 'dt2':}
...

当我在第二个终端上运行命令python3 code01.py 时,我希望 main.py 终端上的打印结果应该是:

...
{'dt1':{'dt1':0}, 'dt2':}
{'dt1':{'dt1':1}, 'dt2':}
{'dt1':{'dt1':2}, 'dt2':}
...

然后我在第三个终端上运行命令python3 code02.py,我希望main.py上的打印结果应该是:

...
{'dt1':{'dt1':3}, 'dt2':{'dt2':1}}
{'dt1':{'dt1':4}, 'dt2':{'dt2':2}}
{'dt1':{'dt1':5}, 'dt2':{'dt2':3}}
...

希望我的描述能说得通,这个问题可能与多线程有关,但我对编程很陌生,不太了解并发。 我如何设计我的代码来实现这一点?非常感谢。

【问题讨论】:

    标签: asynchronous python-3.6


    【解决方案1】:

    我不确定这是否是您所追求的,但您需要显式线程是正确的。问题是每个终端都在运行自己的实例,因此有自己的数据副本。

    您可能想查看threading library,它可以很容易地运行多个线程。这是您的代码的简化版本,可能会有所帮助:

    prepdt.py

    data = {}
    
    
    def add_data(key, value):
        if key not in data:
            data[key] = []
        data[key].append(value)
    
    
    def show_data():
        print(data)
    

    main.py

    import threading
    import time
    import prepdt
    
    
    def func01():
        a = 0
        for _ in range(5):
            a += 1
            prepdt.add_data("dt1", a)
            print(f"func01 added {a} to dt1...")
            time.sleep(2)
    
    
    def func02():
        a = 0
        for _ in range(5):
            a += 1
            prepdt.add_data("dt2", a)
            print(f"func02 added {a} to dt2...")
            time.sleep(1)
    
    
    if __name__ == "__main__":
        prepdt.show_data()
        t1 = threading.Thread(target=func01)
        print("thread t1 starting...")
        t1.start()
        t2 = threading.Thread(target=func02)
        time.sleep(2)
        print("thread t2 starting...")
        t2.start()
    
        while t1.is_alive() or t2.is_alive():
            prepdt.show_data()
            time.sleep(3)
    
        prepdt.show_data()
        print("Done!")
    

    如果你真的想在不同的终端启动进程并与相同的数据交互,我认为最好的办法是编写一个小服务器来存储侦听输入的数据,以及一个可以与服务器交互的客户端;然后可以在不同的终端中打开不同的客户端......不过,这是一个稍微大一点的项目。

    【讨论】:

    • 感谢您的友好回复,我将尝试服务器方式,这正是我所期待的,希望我能回答我的问题。我可以在此之前保持这个问题吗?
    • @Kylxyz 你打赌。这个Real Python tutorial on threading 可能是设置服务器和客户端的一个很好的起点。
    • 谢谢@Richard Ambler,我解决了这个问题。就像你建议的那样,我使用了服务器方式。
    猜你喜欢
    • 2010-10-17
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多