什么是Python _thread模块中的Lock?

时间:2015-02-15 03:55:32

标签: python multithreading python-multithreading

我阅读了“核心Python应用程序编程”,其中编写了此代码。

import _thread
from time import sleep, ctime

loops = [4, 2]

def loop(nloop, nsec, lock):
  print("start loop", nloop, "at:", ctime())
  sleep(nsec)
  print("loop", nloop, "done at:", ctime())
  lock.release()

def main():
  print("starting at:", ctime())
  locks = []
  nloops = range(len(loops))

  for i in nloops:
    lock = _thread.allocate_lock()
    a = lock.acquire()
    locks.append(lock)

  for i in nloops:
    _thread.start_new_thread(loop, (i, loops[i], locks[i]))

  for i in nloops:
    while locks[i].locked(): pass

  print("all DONE at:", ctime())

if __name__ == "__main__":
  main()

在官方参考资料中,我看到“一次只有一个线程可以锁定”。 锁是确保一次只执行一个线程,不是吗? 现在我有两个问题。

  1. 为什么可以制作多个锁?
  2. 为什么两个线程可以同时获取每个锁?

1 个答案:

答案 0 :(得分:1)

Re(1),您可以根据需要制作尽可能多的锁 - 可能需要在多线程环境中保护不同的共享可变资源(个人而言,我认为编程环境中有许多线程共享许多可变的资源是程序员在过世之后去的地方,如果他们过着非常可怕的生活)。

Re(2),“为什么两个线程可以同时获取每个锁” - 它们绝对不能,这就是锁的所有内容:每个锁都可以被保持在在任何给定时间,大多数线程。锁定对象是使用操作系统为此目的提供的任何底层资源构建的。