Python 3.6 异步更新字典

Python 3.6 updating dict async

嗨,我是一个新人,正在研究 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}}
...

希望我的描述有意义,这个问题可能与多线程有关,但我是编程新手,不太了解并发。 我如何设计我的代码来实现这一目标?非常感谢。

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

您可能想查看 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!")

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