gpt4 book ai didi

python - 更多的标题困惑。为什么信号量这么慢?

转载 作者:行者123 更新时间:2023-12-03 13:04:40 27 4
gpt4 key购买 nike

这个问题是我上一个问题 ( Threading in Python - What am I missing? ) 的续集。

感谢指出线程问题所在的人员。那个问题终于解决了,我启用了信号量并且很惊讶仅仅启用它们就将程序的执行时间从几分之一秒缩短到 4 秒!哇...仅 80000 次迭代的 3 秒似乎慢得可怕,即使考虑到碰撞也是如此。

确切时间:

Without semaphore      0.0167980194092 s
With semaphore 2.76963996887 s

代码如下:

import threading
import time
import random

turnstile_names = ["N", "E", "S", "W"]
count = 0
sem = threading.Semaphore(1)

class Incrementer(threading.Thread):
def __init__(self, id):
threading.Thread.__init__(self)
self.id = id

def run(self):
global count, sem
for i in range(20000):
sem.acquire()
count = count + 1
sem.release()

def main():

random.seed(507129)
incrementers = [Incrementer(name) for name in turnstile_names]

for incrementer in incrementers:
incrementer.start()

# We're running!

for incrementer in incrementers:
incrementer.join()

print count
return 0

if __name__ == '__main__':
main()

最佳答案

我无法评论为什么信号量这么慢,但是有一种方法可以通过使用锁而不是信号量来显着加快您的代码:

lock = threading.Lock()

class Incrementer(threading.Thread):
def __init__(self, id):
threading.Thread.__init__(self)
self.id = id

def run(self):
global count, lock
for i in range(20000):
with lock:
count = count + 1

不同步:0.02s
信号量同步:2.69s
使用锁:0.36s

也就是说,我认为在略多于两秒半的时间内获取和释放信号量八万次是不错的性能——线程同步是有代价的——但你应该看看你的选择并选择适合的工具你的用例是最好的,在这种情况下它是一个锁而不是信号量,因为你只有一个资源。

关于python - 更多的标题困惑。为什么信号量这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29666457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com