我正在实现一个多线程,我有一个问题的数据。基本上(简化代码)第一个线程是收集数据从外部源每0.5秒。代码如下:
dataRef = {}
data_lock = threading.Lock()
def readData():
global dataRef
dataRefNew = {}
while True:
dataRefsValues = simulate_external_data_source()
with data_lock:
dataRef = dataRefsValues
sleep(0.5)
字符串
另一个线程检查以前的数据和活动数据是否相同或已更改
def eventCheck():
global dataRef
dataRefPrevious = {}
dataRefActive = {}
while True:
with data_lock:
if bool(dataRefPrevious) == True:
dataRefActive = dataRef
print('dataRefPrevious', dataRefPrevious,"\n")
print('dataRefActive', dataRefActive, "\n")
dataRefPrevious = dataRefActive
else:
dataRefPrevious = dataRef
sleep(1)
型
我遇到的问题是,在循环期间,dataRefPrevious总是与dataRefActive相同,为什么?
3条答案
按热度按时间inkz8wg91#
Q:
eventCheck
函数在发布data_lock
后会做什么?当线程A解锁并立即重新锁定一个互斥锁,而另一个线程B正在等待它时,很可能A每次都是赢家,而B永远不会有机会。这并不“公平”,但在大多数操作系统中,互斥锁通常是这样实现的。
我不确定这是不是你的程序中发生的事情(顺便说一下,它被称为“饥饿”),但是如果你想让
readData
函数有机会绕着它的循环一圈,时不时地收集一些数据,那么你可以尝试让另一个线程时不时地释放互斥量一段时间。也许只需要将
sleep(1)
调用增加四个空格就可以了?按照编写的方式,sleep(1)
是不可访问的代码。k3bvogb12#
检查缩进,
sleep(1)
应该在while
循环内:字符串
印刷品:
型
ctehm74n3#
我可能发现了一个问题,但没有明确的解释为什么...
我测试了一个函数:
字符串
我得到的是:
型
然而,当我在代码中替换以下行时:
型
收件人:
型
我得到正确的价值观如下(以前不同,比活跃)
型
我认为
=
将dict dataRefPrevious的ref设置为dataRefActive dict,而.update()
更改了变量本身。