[英]global lock causing my program to stop running
Whenever I run part of my program that has a threading.Lock
in it, my program stops running altogether (It does not crash, just pauses).每当我运行其中包含
threading.Lock
程序的一部分时,我的程序就会完全停止运行(它不会崩溃,只是暂停)。
I need this as it is a server and multiple clients may be connecting and trying to overwrite the data all at the same time.我需要这个,因为它是一个服务器,多个客户端可能正在连接并试图同时覆盖所有数据。 At the time of running this, only one thread was active with a client connecting to it.
在运行它时,只有一个线程处于活动状态,客户端连接到它。 I use this for my Sqlite3 databases too.
我也将它用于我的 Sqlite3 数据库。 I have not noticed it causing a problem there, as it seems to run perfectly fine despite the global lock.
我没有注意到它在那里引起了问题,因为尽管有全局锁定,它似乎运行得很好。 All are done in the same format of
所有都以相同的格式完成
with global_lock:
Here is where the thread starts alongside how I import the thread这是线程从我导入线程的方式开始的地方
from threading import Thread, Lock
global_lock = Lock()
while True:
conn, addr = s.accept()
connThread = Thread(target=handler, args=(conn, addr))
connThread.daemon = True
connThread.start()
Here is the program这是程序
def addUser_InHash(username, password):
print("Adding user in hash")
hashID = 0
hashString = username + password
added = False
for i in hashString:
hashID += ord(i)
hashID = hashID % hashKey
print(hashID, "hashID in addUser")
file = open("LoginHashTable.pickle", "rb+")
if os.path.getsize("LoginHashTable.pickle") > 0:
hashTable = pickle.load(file)
print("File not empty,\nSaved Data:\n{}".format(hashTable))
else:
print("File empty")
hashTable = {}
count = 0
while not added:
print("while not count :", count)
count += 1
if hashID in hashTable:
# If this index exists
if hashID > (hashKey - 1):
hashID = 0
else:
hashID += 1
if hashID > (hashKey - 1):
hashID = 0
else:
print("User doesnt exist, adding to hash table")
hashTable[hashID] = [username, password]
print("New Added")
print(hashTable)
added = True
print("Saving updated file addUser_InHash")
if hashTable:
with global_lock:
file.seek(0) # Move file pointer back to beginning of file
file.truncate() # Empty file by truncating to current file pointer position
pickle.dump(hashTable, file)
print(hashTable)
print("Data saved")
file.close()
else:
print("Hash table still empty, addUser_InHash")
def deleteUser_InHash(username, password):
print("In deleteUser_InHash\nUsername: {}\nPassword: {}".format(username,password))
dataFound = True
hashID = 0
count = 0
hashString = username + password
if os.path.getsize("LoginHashTable.pickle") > 0:
file = open("LoginHashTable.pickle", "rb+")
hashTable = pickle.load(file)
print("File not empty,\nSaved Data:\n{}".format(hashTable))
else:
print("File empty")
dataFound = False
if dataFound:
print("datafound true")
for i in hashString:
hashID += ord(i)
hashID = hashID % hashKey
print("hashID:",hashID)
try:
print("In try")
while dataFound:
print("In while, count:",count)
if count == hashKey:
dataFound = False
if hashTable[hashID] == [username,password]:
del hashTable[hashID]
print("Outside global lock")
with global_lock:
print("Inside global lock")
file.seek(0) # Move file pointer back to beginning of file
file.truncate() # Empty file by truncating to current file pointer position
pickle.dump(hashTable, file)
print(hashTable)
print("Data saved")
file.close()
print("Outside global lock")
print("Data updated")
print("User :", username, "deleted")
break
else:
hashID += 1
count += 1
except IndexError:
print("username could not be found")
return False
else:
return False
The two functions are called in this sequence:这两个函数按以下顺序调用:
deleteUser_InHash(username1,password1)
addUser_InHash(username2,password2)
The with global lock works fine in deleteUser_InHash()
function but stops the program in addUser_InHash()
.在全球锁工作正常
deleteUser_InHash()
函数,但在停止程序addUser_InHash()
The program hangs here:程序挂在这里:
{33: ['foo', 'bar'], 0: ['toni', 'tony'], 34: ['bar', 'foo'], 118: ['fo', 'la'], 8: ['Tom', 'Tom'], 262: ['Kam', 'Kam'], 258: ['yes', 'no']}
Saving updated file addUser_InHash
Hanging on the line the piece of code:挂在行上的一段代码:
if hashTable:
with global_lock:
I know this is true as it never gets to the print statements:我知道这是真的,因为它永远不会进入打印语句:
print(hashTable)
print("Data saved")
Inside "addUser_InHash()"在“addUser_InHash()”里面
Note to all: I changed大家注意:我变了
global_lock = Lock()
to到
global_lock = RLock()
and now my program is running fine, I believe it has something to do with the fact that RLock allows threads to re-acquire a lock more than once, whilst it seems that normal locks cannot?现在我的程序运行良好,我相信这与 RLock 允许线程多次重新获取锁有关,而普通锁似乎不能?
Source:https://docs.python.org/3/library/threading.html#thread-objects来源:https ://docs.python.org/3/library/threading.html#thread-objects
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.