Python-多线程-锁必须是全局的吗?
我是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
我想在线程中使用锁。它必须在线程中声明为全局吗? 我的代码如下所示:
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
#全局锁?????????????
当我
要回答您的直接问题,线程不必使用noglobal
来知道锁变量是什么
不幸的是,“正确用法”的答案取决于您的应用程序/情况。只要您的锁实际上是应用程序的全局锁,您所做的事情就没有本质上的错误。如果您的锁不是应用程序的全局锁,或者您希望将应用程序分离,那么可以通过创建自己的线程对象来实现
祝你好运 不,它不必是全局的。您可以在函数中创建它,然后将其作为参数传递给线程,如下所示:
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,)
创建线程。我不喜欢这个,但我发布这个问题时马克·迪金森的评论似乎对我有所帮助,所以我接受这个答案。