簡體   English   中英

Python - 多線程 - Lock必須是全局的嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM