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!")
如果你真的想在与相同数据交互的不同终端中启动进程,我认为最好的办法是编写一个小服务器来存储侦听输入的数据,以及一个可以与之交互的客户端服务器;然后可以在不同的终端打开不同的客户端...不过,这是一个稍微大一点的项目。
嗨,我是一个新人,正在研究 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!")
如果你真的想在与相同数据交互的不同终端中启动进程,我认为最好的办法是编写一个小服务器来存储侦听输入的数据,以及一个可以与之交互的客户端服务器;然后可以在不同的终端打开不同的客户端...不过,这是一个稍微大一点的项目。