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

Python-多线程-锁必须是全局的吗?,python,multithreading,locking,Python,Multithreading,Locking,我是python多线程的初学者。 我想在线程中使用锁。它必须在线程中声明为全局吗? 我的代码如下所示: 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].so

我是python多线程的初学者。
我想在线程中使用锁。它必须在线程中声明为全局吗? 我的代码如下所示:

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
lock=threading.RLock()
def do_work():
全球i
#全局锁?????????????
当我
要回答您的直接问题,线程不必使用no
global
来知道锁变量是什么

不幸的是,“正确用法”的答案取决于您的应用程序/情况。只要您的锁实际上是应用程序的全局锁,您所做的事情就没有本质上的错误。如果您的锁不是应用程序的全局锁,或者您希望将应用程序分离,那么可以通过创建自己的线程对象来实现


祝你好运

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

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()
i=0
def do_工作(锁定):
全球i
当我
您是在询问是否必须使用
global
关键字,还是
lock
变量的范围是否正确?我是在询问正确用法。通常的做法是将锁作为参数传递给
do\u work
。因此,
do_work
变成了
do_work(lock)
,你用
threading.thread(target=do_work,args=(lock,)
创建线程。我不喜欢这个,但我发布这个问题时马克·迪金森的评论似乎对我有所帮助,所以我接受这个答案。