使用锁而不是事件?

Using locks instead of events?

提问人:Deltag0ny 提问时间:10/26/2022 更新时间:10/26/2022 访问量:51

问:

所以我在学习线程,看到锁是用来同步线程的。但是,我不明白为什么使用锁定而不是触发事件会更有利。

在这个示例中,我通过触发事件使第一个线程在第二个线程之后完成。有没有办法使用锁来达到相同的结果,它是否更有效率?

from threading import *
import time

list1 = []
def computation():
    print('Starting computation')
    global list1
    for x in range(100000000):
        list1.append(x) 
    if t2 == True:                     #Making it give me a "result" after the other thread if it would need data from it, for example.
        print('End of computation')

def Background_work(x, lock):
    with lock:
        for x in range(x):
            print('...')
            time.sleep(2)
    return True


if __name__ == '__main__':
    lock = Lock()
    t1 = Thread(target = computation)
    t2 = Thread(target = Background_work, args = (5, lock))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print('All tasks completed')

我还包含了一个无用的锁定,因为我不明白为什么这段代码没有给出相同的结果:Background_work()

list1 = []
def computation():
    print('Starting computation')
    global list1
    for x in range(100000000):
        list1.append(x) 
        time.sleep(0.01)
    print('End of computation')

def Background_work(x, lock):
    with lock:
        for x in range(x):
            print('...')
            time.sleep(2)



t1 = Thread(target = computation)
t2 = Thread(target = Background_work, args = (5, lock))
t1.start()
t2.start()

我以为第一个线程会一直运行,直到它到达,此时第二个线程的锁会让它等到自己完成,因为第一个线程正在休眠。time.sleep()

多线程 事件 锁定 python-multithreading

评论

0赞 Jim Rogers 10/26/2022
你的例子试图完成什么。看来您只是强迫 t2 等待一段时间让 t1 完成。t1 附加到 List1,但 t2 不访问 List1。锁通常用于防止对共享对象进行不适当的同时访问。
0赞 Deltag0ny 10/26/2022
是的,也许我的例子不是最好的说明,因为我实际上没有使用来自第二个线程的任何数据,但这些只是填充示例。我附上了一条评论,说一种可能的情况是它使用来自第二个线程的数据。
0赞 Savir 10/26/2022
我认为你错了。这不是 的返回值。 之后完成,因为它需要更长的时间。GIL 加剧了这种影响(运行一点,然后 ,休眠并释放 GIL,然后运行另一个位......如果你把范围变小(去掉一个或两个零),你会看到它提前完成。此外,我还邀请您转换两个函数以对列表执行相同的操作,并查看使用线程与使用进程之间的巨大性能差异。t2 == TrueTruet2t1t2t1t2t1t1.appending
0赞 Deltag0ny 10/26/2022
多亏了你的评论,我理解得更好,但我仍然有一些不确定因素。如果没有什么可以让它进入睡眠状态,为什么 t1 会停止运行?如果一个线程必须进入睡眠状态才能让另一个线程工作,那么多线程的意义是否只是为了让另一个线程在等待时(例如在联系服务器时)工作?是的,我意识到你是对的,t2 的返回值不是 True。最后我也会试试你说的。我也很想知道为什么我用的锁没有改变任何东西。
0赞 Paul Cornelius 10/26/2022
线程通过定期快速来回切换来营造同时执行的错觉。切换不受您的直接控制。锁的目的是防止两个线程“同时”尝试修改相同的数据结构。一个线程可以获取锁的所有权,从而防止其他线程获得对同一锁的控制权。在测试代码中,您只在一个线程中使用 Lock;这根本不会做任何事情。

答: 暂无答案