Python - 多线程 - Lock必须是全局的吗?

时间:2016-02-11 13:21:40

标签: python multithreading locking

我是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()

2 个答案:

答案 0 :(得分:1)

否,它不必是全局的。您可以在函数中创建它,然后将其作为参数传递给线程,如下所示:

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()

答案 1 :(得分:0)

要回答您的直接问题,不必使用display来让线程知道锁变量是什么。 Here is more information on scope in Python

不幸的是,答案是&#34;正确的用法&#34;取决于您的申请/情况。只要您的锁实际上是您的应用程序的全局锁定,您所做的事情就没有任何内在错误。如果您的锁不是您的应用程序的全局锁,或者您想要破坏您的应用程序,您可以通过创建自己的线程对象来实现。 Here is a great tutorial on using threads/locks.

祝你好运!