[英]Python - Multithreading - Does Lock have to be global?
我是python中多線程的初學者。
我想在線程中使用Lock。 是否必須在線程中聲明為全局? 我的代碼看起來像這樣:
i = 0
lock = threading.RLock()
def do_work():
global i
# global lock ?????????????
while i < len(my_list):
lock.acquire()
my_i = i
i += 1
lock.release()
my_list[my_i].some_works()
workers = [threading.Thread(target=do_work) for _ in range(8)]
for worker in workers:
worker.start()
不,它不一定是全球性的。 您可以在函數中創建它,然后將其作為參數傳遞給您的線程,如下所示:
i = 0
def do_work(lock):
global i
while i < len(my_list):
with lock: # cleaner way to .acquire() and .release()
my_i = i
i += 1
my_list[my_i].some_works()
def main():
lock = threading.RLock()
workers = [threading.Thread(target=do_work, args=lock,) for _ in range(8)]
for worker in workers:
worker.start()
main()
要回答你的直接問題,線程不必使用global
來知道鎖變量是什么。 以下是有關Python范圍的更多信息
不幸的是,“正確使用”的答案取決於您的應用/情況。 只要您的鎖實際上是應用程序的全局鎖定,您所做的事情就沒有任何內在錯誤。 如果您的鎖不是您的應用程序的全局鎖,或者您想要破壞您的應用程序,您可以通過創建自己的線程對象來實現。 這是一個關於使用線程/鎖的好教程。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.