我是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()
答案 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.
祝你好运!