python 锁和线程并发

10 浏览
0 Comments

python 锁和线程并发

我有一个关于Python锁和线程的问题,我意识到锁用于防止变量被另一个线程覆盖,使用锁来解决这个问题是正常的吗?这意味着你只能同时运行一个线程,同时还意味着为可能被覆盖的每个变量创建acquire/release锁,对于我的项目来说,这会涉及到相当多的锁!人们是怎么做到的呢?是将变量封装在线程安全的列表中,还是根据线程名创建唯一的变量?还是每个地方都插入锁的acquire和release?

0
0 Comments

Python中出现线程锁和并发性的问题主要是由于全局解释器锁(Global Interpreter Lock,GIL)的存在。大多数Python实现都有GIL,它在很大程度上消除了使用线程的优势。如果使用线程等待IO操作,可以通过使用异步IO来获得相同或更好的性能。如果使用线程进行计算(数值计算)跨处理器,由于Python全局锁的限制,线程无法正常工作,此时最好使用多进程。

与没有优势相比,Python中的线程存在许多缺点和注意事项,正如你已经发现的那样。您仍然需要进行数据共享控制,并处理与线程在您无法控制的时刻接收CPU注意力相关的奇怪问题。所有这些都没有任何好处。

总之,不要使用线程。

感谢您的回答,总结起来就是尽量使用多进程而不是线程,因为这样可以避开对GIL的要求,是吗?

是的,如果需要多核数值计算,那么可以使用多进程。如果需要等待输入/输出,则只需在单个线程/进程中使用异步IO即可。

线程并不是毫无好处。当您需要在任务之间共享大量状态时,请使用线程。当您不需要共享状态并且派生进程的开销很高时(例如,当您需要在进程之间共享许多KB的状态时),请使用多进程。这里有一个由Python核心贡献者制作的很棒的视频(youtube.com/watch?v=Bv25Dwe84g0)。在创建线程后,您需要小心避免派生进程。我认为数值计算通常发生在GIL之外(C库在执行处理时应该会释放GIL)。

0