gpt4 book ai didi

python - 使用 python 多线程访问共享数据的最佳实践是什么

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:39 25 4
gpt4 key购买 nike

在python多线程中,有一些原子类型可以访问由多个线程没有保护(列表,字典等)。还有一些类型需要加锁保护。

我的问题是:

  1. 在哪里可以找到列出所有原子类型的官方文档,我可以在谷歌上搜索一些答案,但它们不是“官方”并且已经过时了。

  2. 一些书建议我们应该用锁保护所有共享数据,因为原子类型可能因为非原子,我们不应该依赖它。它是否正确?因为锁肯定有开销,即使对于大程序,这个开销也可以忽略不计吗?

最佳答案

用于使操作原子化。这意味着只有一个线程可以访问某些资源。 使用许多锁会导致您的应用程序失去线程的好处,因为只有一个线程可以访问资源。

仔细想想,这没什么意义。它会让你的程序变慢,因为 python 需要管理线程之间的上下文切换。

使用线程时,您应该尽可能最小化锁的数量。尽可能尝试使用局部变量。让你的函数做一些工作,并返回一个值而不是更新现有的值。然后您可以创建一个队列并收集结果。

除了锁之外,还有信号量。这些基本上都是锁,只有有限数量的线程可以使用它:

A semaphore manages an internal counter which is decremented by each acquire() call and incremented by each release() call. The counter can never go below zero; when acquire() finds that it is zero, it blocks, waiting until some other thread calls release().

Python 有一个很好的文档 threading module

<小时/>

这是一个使用单线程与 3 线程测试的虚拟函数的小示例。注意Lock对运行时间的影响:

线程(无锁)持续时间:1.0949997901

线程(带锁)持续时间:3.1289999485

单线程持续时间:3.09899997711

def work():
x = 0
for i in range(100):
x += i
lock.acquire()
print 'acquried lock, do some calculations'
time.sleep(1)
print x
lock.release()
print 'lock released'

关于python - 使用 python 多线程访问共享数据的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46971830/

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