【问题标题】:Using lock in sub class of threading.Thread in python3在python3的threading.Thread的子类中使用锁
【发布时间】:2022-01-21 02:31:55
【问题描述】:

我想问一个关于以下代码的问题:假设我们要构建一个threading.Thread 子类ThreadCounter,这样它就有一个名称、一个初始值和一个终端值作为参数,并且一旦启动它就会递增初始值直到等于终结值。

import threading
from threading import Thread
import time

lock = threading.Lock()

class ThreadCounter(Thread):
   def __init__(self, nome, first, limit, lock):
       # Call the Thread class's init function
       Thread.__init__(self)
       self.nome = nome
       self.first = first
       self.limit = limit
       self.lock = lock
       
   # Override the run() function of Thread class
   def run(self):
       while self.first < self.limit:
           self.lock.acquire()
           self.first += 1
           print(self.nome,self.first)
           time.sleep(3)
           
           self.lock.release()
           
         
t1 = ThreadCounter('Thread-1', 1, 5, lock)
t2 = ThreadCounter('Thread-2', 2, 10, lock)
t1.start()
t2.start()
t1.join()
t2.join()

我不明白当我们在两个类中使用锁时会发生什么。特别是,我们是否将相同的锁对象分配给具有分配的两个实例

t1 = ThreadCounter('Thread-1', 1, 5, lock)
t2 = ThreadCounter('Thread-2', 2, 10, lock)

或者我们对于 ThreadCounter 类的每次出现都有一个不同的锁对象,这样 t1 和 t2 就不会共享同一个锁?

【问题讨论】:

  • id() 函数为您提供任何 Python 对象的唯一标识符。这个ID只有在一个对象被销毁后才会被重用,但同时对于两个对象来说,它永远不会相同。我之所以提到这一点,是因为它可以让您自己在这里回答您的问题,并在将来回答任何类似的问题。

标签: python multithreading


【解决方案1】:

这是同一个锁。如果每个线程都有自己的锁,就会破坏锁定的目的。

锁的目的是使两个线程同步,以确保它们不会同时执行临界区。在这种情况下,它唯一有效锁定的是print,但如果两个线程像列表一样操作共享资源,则锁定将确保一次只有一个线程接触列表。这是必需的,因为大多数对象不能同时跨线程操作(“非线程安全”)。


查看“同步原语”以了解不同的同步选项是什么,以及为什么它们是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2019-10-12
    • 2010-10-21
    • 2019-07-12
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多